哲学♂王子 @ 2021-02-21 18:20:17
Rt,样例输入:
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
错误出在“19”的位置上。
看了下,在运行到“19”这个位置的时候,以每个点为起点的最长长度应该是这样的:
1 2 3 4 5
16 17 18 19 6
15 1 1 1 7
14 1 1 1 8
13 12 11 10 9
然而我的代码却跑成了这样:
1 2 3 4 5
16 17 18 7 6
15 1 1 1 7
14 1 1 1 8
13 12 11 10 9
想了半个小时也没想出错误的地方,看了题解也不懂。提交上去,WA了#3,#9,#10点。
求大佬帮忙康康代码qwq:
#include<bits/stdc++.h>
using namespace std;
int R,C,Snow[105][105],View[105][105],s,x,z,y,An;
bool Pd[105][105];
int Play(int a,int b);
int main()
{
scanf("%d%d",&R,&C);
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{
scanf("%d",&Snow[i][j]);
View[i][j]=1;
}
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{
View[i][j]=Play(i,j);
An=max(An,View[i][j]);
}
printf("%d",An);
return 0;
}
int Play(int a,int b)
{
s=x=z=y=0;
if(Pd[a][b]==true)
return View[a][b];
if(a!=1&&Snow[a-1][b]<Snow[a][b])
{
s=Play(a-1,b)+1;
View[a-1][b]=s-1;
Pd[a-1][b]=true;
}
if(a!=R&&Snow[a+1][b]<Snow[a][b])
{
x=Play(a+1,b)+1;
View[a+1][b]=x-1;
Pd[a+1][b]=true;
}
if(b!=1&&Snow[a][b-1]<Snow[a][b])
{
z=Play(a,b-1)+1;
View[a][b-1]=z-1;
Pd[a][b-1]=true;
}
if(b!=C&&Snow[a][b+1]<Snow[a][b])
{
y=Play(a,b+1)+1;
View[a][b+1]=y-1;
Pd[a][b+1]=true;
}
Pd[a][b]=true;
int A=max(View[a][b],s);
A=max(A,x);
A=max(A,z);
A=max(A,y);
return A;
}
谢谢大佬,不胜感激。
by tongziyu @ 2021-02-23 07:35:13
你新建四个变量,在Play函数的每个if语句后面存一下s,x,y,z,然后A最后去比较那四个变量和View[a][b]就能AC了
by tongziyu @ 2021-02-23 07:39:08
int Play(int a,int b)
{
int u,d,l,r;
s=x=z=y=0;
if(Pd[a][b]==true)
return View[a][b];
if(a!=1&&Snow[a-1][b]<Snow[a][b])
{
s=Play(a-1,b)+1;
View[a-1][b]=s-1;
Pd[a-1][b]=true;
}
u=s;
if(a!=R&&Snow[a+1][b]<Snow[a][b])
{
x=Play(a+1,b)+1;
View[a+1][b]=x-1;
Pd[a+1][b]=true;
}
d=x;
if(b!=1&&Snow[a][b-1]<Snow[a][b])
{
z=Play(a,b-1)+1;
View[a][b-1]=z-1;
Pd[a][b-1]=true;
}
l=z;
if(b!=C&&Snow[a][b+1]<Snow[a][b])
{
y=Play(a,b+1)+1;
View[a][b+1]=y-1;
Pd[a][b+1]=true;
}
r=y;
Pd[a][b]=true;
int A=max(View[a][b],u);
A=max(A,d);
A=max(A,l);
A=max(A,r);
return A;
}
by 哲学♂王子 @ 2021-02-23 12:54:26
@tongziyu 谢谢大佬qwq!