无形的狗子 @ 2019-07-16 11:43:22
#include<iostream>
#include<cstdio>
using namespace std;
long long a[110][110],x,y,s=1,xx,yy;
int h[5]={-1,0,0,1},l[5]={0,-1,1,0},maxn=0;
int hsm()
{
int m,n;
long long big=0;
for(int k=0;k<4;k++)
{
m=x+h[k];
n=y+l[k];
if(m<=0||n<=0) continue;
if((a[m][n]>big)&&(a[m][n]<a[x][y]))
{
big=a[m][n];
xx=m;
yy=n;
}
}
if(big==0) return 0;
s++;
x=xx;
y=yy;
return hsm();
}
int main()
{
int r,c;
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>a[i][j];
if(a[i][j]>maxn)
{
maxn=a[i][j];
x=i;
y=j;
}
}
}
hsm();
cout<<s;
return 0;
}
想要几个样例......只有40分T_T
by ueettttuj @ 2019-07-16 12:10:18
@无形的狗子 找标程对拍
by 狄凡人 @ 2019-07-16 12:17:31
我没具体看哪里有问题,但是个人建议把全局变量和函数中的变量分开,即,在函数中尽量不要改变全局变量,这样检查起来比较方便
by xyy123456 @ 2019-07-16 12:23:30
你每次都从最高的点滑起,可这不一定是最佳策略啊,比如 1 2 3 4 9 1 2 3 1 2 3 4 1 2 3 4 9开始只能划2格 你要每个点都算一遍,用记忆化搜索应该不会超时
by xyy123456 @ 2019-07-16 12:27:33
@xyy123456 换行怎么不见了。。我输的时候是4*4的1 2 3 4;9 1 2 3;1 2 3 4;1 2 3 4;
by xyy123456 @ 2019-07-16 12:43:39
@无形的狗子 @你一下,不然你可能不会来看
by 无形的狗子 @ 2019-07-16 14:27:36
@xyy123456 是这个问题哦,谢谢,我再改。
by 无形的狗子 @ 2019-07-16 14:28:50
@狄凡人 好的,尽量。
by 无形的狗子 @ 2019-07-16 14:29:54
@ueettttuj 是找正确程序对应检查的意思吗?
by 无形的狗子 @ 2019-07-16 14:45:21
还是不对......
#include<iostream>
#include<cstdio>
using namespace std;
long long a[110][110],s=1,xx,yy,aa,bb,ans;
int h[5]={-1,0,0,1},l[5]={0,-1,1,0};
int hsm(int x,int y)
{
int m,n;
long long big=0;
for(int k=0;k<4;k++)
{
m=x+h[k];
n=y+l[k];
if(m<=0||n<=0) continue;
if((a[m][n]>big)&&(a[m][n]<a[x][y]))
{
big=a[m][n];
xx=m;
yy=n;
}
}
if(big==0)
{
if(s>ans) ans=s;
s=1;
return 0;
}
s++;
x=xx;
y=yy;
return hsm(x,y);
}
int main()
{
int r,c;
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
cin>>a[i][j];
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
aa=i;
bb=j;
hsm(aa,bb);
}
}
cout<<ans;
return 0;
}
by 无形的狗子 @ 2019-07-16 14:49:29
顺便弱弱问一下,这一题要用记忆化数组吗?本蒟蒻刚学完递归函数,不太懂。