交叉模拟-洛谷P1086花生采摘题解

题目链接

题目戳这里

用到的思想

模拟类题目基本上没有什么思想,该题解采用试错回溯的方法进行模拟,减少了代码量。值得注意的是,该题解编写了两个子函数,体现了自顶向下的编程思路;虽然是道简单题,但题解代码中的子函数采用了以指针为返回值的方式,优势是可读性较强,便于进行交互。此外,该题解在函数和变量的命名方式上也有些特点。在对死循环的写法上,也尽可能使之易于调试。

代码

#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

本题题解、代码及注释均为作者原创,转载请注明。
作者技术水平有限,如有纰漏之处,敬请斧正。
欢迎大家一起学习交流。

发布了50 篇原创文章 · 获赞 7 · 访问量 1158

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103037817