题目链接
用到的思想
模拟类题目基本上没有什么思想,该题解采用试错回溯的方法进行模拟,减少了代码量。值得注意的是,该题解编写了两个子函数,体现了自顶向下的编程思路;虽然是道简单题,但题解代码中的子函数采用了以指针为返回值的方式,优势是可读性较强,便于进行交互。此外,该题解在函数和变量的命名方式上也有些特点。在对死循环的写法上,也尽可能使之易于调试。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=25;
int* maxhs(int (*a0)[maxn],int m0,int n0){ //编写函数来求当前花生田里的最多花生,注意这里的命名技巧
int* ans=new int;
ans[0]=0;
for(int i0=1;i0<=m0;i0++)
for(int j0=1;j0<=n0;j0++){
if(a0[i0][j0]>ans[0]){
ans[0]=a0[i0][j0];
ans[1]=i0;
ans[2]=j0;
}
}
return ans; //函数里面充当返回值的变量,一般就命名为ans,简单直观
}
int l(int x1,int y1,int x2,int y2){ //计算两点之间的步数
return abs(x1-x2)+abs(y1-y2);
}
int main(){
freopen("in.txt","r",stdin); //个人习惯调试时用文件输入输出
freopen("out.txt","w",stdout);
int a[maxn][maxn];
memset(a,0,sizeof(a));
int m,n,k;
cin>>m>>n>>k; //输入,一般将数组命名为a,各个变量命名与原题一致;
for(int i=1;i<=m;i++) //这里数组从1开始编号,原因是第一,以1开始编号与题图一致,第二,因为涉及花生田外的道路,道路的横坐标可以看做是0
for(int j=1;j<=n;j++) cin>>a[i][j];
int x,y; //涉及状态问题,要随时知道猴子的位置(x,y)
int* ans;
ans=maxhs(a,m,n);
x=0;
y=ans[2]; //猴子初始时在道路上,其纵坐标等于初始时最多花生的花生田纵坐标
int numans=0; //最终答案,即花生数量
for(int i=1;i<=9999999;i++){ //记录状态,此处用一个类似死循环的东西 ,因为如果用死循环,很可能因代码错误或输入错误而无法跳出,我们这里规定它一定会跳出以便于调试代码
if(!ans[0]) break; //当花生田为空的的时候,直接跳出(这里也可以防特殊数据)
k-=l(x,y,ans[1],ans[2]); //试吃一下;
k--; //一定要注意这里,吃花生还要一个单位时间
x=ans[1];
y=ans[2];
if(k>=l(x,y,0,y)){ //如果还能保证回去,则猴子吃掉花生继续冒险
numans+=ans[0];
}
else{ //回不去了,则此次试吃非法,跳出循环
break;
}
a[ans[1]][ans[2]]=0; //吃掉花生
ans=maxhs(a,m,n); //寻找下一个花生田
}
cout<<numans;
return 0;
}
作者
Bowen
本题题解、代码及注释均为作者原创,转载请注明。
作者技术水平有限,如有纰漏之处,敬请斧正。
欢迎大家一起学习交流。