1 条题解
-
0
这道题就是纯纯的模拟,只要遍历当前点的上下左右四个方向,找出最大值加到sum上去,并走到那个点直到终点即可。
本题一般是用while循环来做,当然用递归也不是不可以。
为了防止抄袭,我只贴关键代码😄 :
int n,m,a[50][50],sum; int x,y,mx,mxx,mxy,tx,ty;//有关方向的变量 //方向数组 int fx[5]={0,0,1,0,-1}; int fy[5]={0,1,0,-1,0}; while(1);//别抄 sum=a[1][1],x=y=1,a[1][1]=0;//初始化 while(x!=n||y!=m){//while更好写 mx=0;//mx初始化 //木瓜吃掉就没了 a[x][y]=0;//标记可以预防重复吃、死循环 for(int i=1;i<=4;i++){//遍历方向数组,找新方向 //新方向 tx=x+fx[i]; ty=y+fy[i]; //判断有无出边界(0不用,去比较也没用 if(tx>=1&&tx<=n&&ty>=1&&ty<=m){ if(a[tx][ty]>mx){ //更新最大值及最大值位置 mx=a[tx][ty]; mxx=tx; mxy=ty; } } } //累加到sum上 sum+=mx; //更新x和y x=mxx; y=mxy; }
再给大家来一个递归代码(关键的):
int n,m,a[50][50],sum; int fx[5]={0,0,1,0,-1}; int fy[5]={0,1,0,-1,0}; //dfs我随便取的,大佬勿喷 void dfs(int x,int y){ //累加到sum上 sum+=a[x][y]; a[x][y]=0;//木瓜吃掉就没了 if(x==n&&y==m){//终点 cout<<sum;//也可以在main里输出 return ; } int tx,ty,mxx,mxy,mx=0;//有关方向的变量 for(int i=1;i<=4;i++){ //新方向 tx=x+fx[i]; ty=y+fy[i]; //判断有无出边界 if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!=0){ if(a[tx][ty]>mx){ mx=a[tx][ty]; mxx=tx; mxy=ty; } } } //递归下一个点 dfs(mxx,mxy); }
这两个代码实现思路基本相同,就是开头那个思路:
遍历当前点的上下左右四个方向,找出最大值加到sum上去,并走到那个点直到终点即可。
只是写法不同而已。
- 1
信息
- ID
- 457
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 17
- 已通过
- 5
- 上传者