1 条题解

  • 0
    @ 2025-5-13 11:19:54

    问题分析

    本题的核心是在给定的稻田中,根据被压平的水稻植株位置,找出青蛙路径中压平植株数量最多的路径。青蛙路径要求至少压平 3 株水稻,且每一跳的长度相同,并且从稻田一侧外部开始,到另一侧外部结束。

    方法思路

    数据结构与初始化 使用一个二维数组 field 来表示稻田,初始时所有元素为 0,表示未被压平的植株。 读取输入的稻田行数 R、列数 C 和被压平的植株数量 N。 对于每一个被压平的植株位置,在 field 数组中将对应位置设为 1。 遍历所有可能路径 对于每一个被压平的植株 (i, j),尝试所有可能的跳跃方向和跳跃长度。 跳跃方向包括水平、垂直和对角线方向(四个对角线方向)。 对于每一个方向,从跳跃长度为 1 开始尝试,直到跳跃出稻田边界。 在每次尝试中,沿着跳跃方向检查路径上的植株是否都被压平,并且路径上至少有 3 株被压平的植株。 如果满足条件,则更新最大压平植株数。

    输出结果

    最后输出最大压平植株数,如果没有找到符合条件的青蛙路径,则输出 0。

    代码实现

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #define eps 1e-10
    #define maxn 5010
    using namespace std;
    struct pi
    {
    	int x,y;	
    };
    pi p[maxn];
    int r,c,n;
    bool b[maxn][maxn];
    int cmp(pi a,pi b)
    {
    	if(a.x!=b.x)
    	return a.x<b.x;
    	return a.y<b.y;
    }
    int step(int x,int y,int dx,int dy)
    {
    	int sp=2;
    	x+=dx;
    	y+=dy;
    	while(x>0&&x<=r&&y>0&&y<=c)
    	{
    	    if(b[x][y]==false)return 0;
    		x+=dx;
    		y+=dy;
    		sp++;
    	}
    	return sp;
    }
    void slove()
    {
    	sort(p,p+n,cmp);
    	int ans=0,temp;
    	int x,y,dy,dx;
    	int x0,y0;
    	for(int i=0;i<n-1;i++)
    	{
    		for(int j=i+1;j<n;j++)
    		{
    			dx=p[j].x-p[i].x;
    			dy=p[j].y-p[i].y;
    			x=p[j].x;
    			y=p[j].y;
    			x0=p[i].x-dx;
    			y0=p[i].y-dy;
    			if(x0>0&&x0<=r&&y0>0&&y0<=c)continue;
    			if(p[i].x+ans*dx>r)break;
    			if(p[i].y+ans*dy>c||p[i].y+ans*dy<1)continue;
    			temp=step(x,y,dx,dy);
    			ans=max(temp,ans);
    		}
    	}
    	printf("%d\n",ans>2?ans:0);
    }
    int main()
    {
    	freopen("1054.txt","r",stdin);
        	scanf("%d%d",&r,&c);
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%d%d",&p[i].x,&p[i].y);
    		b[p[i].x][p[i].y]=1;
    	}
    	slove();
    	return 0;
    }
    
    
    • 1

    信息

    ID
    55
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者