弱肉强食(递归)
作者:互联网
文章目录
前言
第5次发csdn,心情依然有些许的激动
弱肉强食
一片海洋相当于一张 n × m 的网格,其中每个格子里面都有一条鱼。其中,(s,t)这个格子的鱼是一条鲨鱼。
海洋是一个弱肉强食的社会,鲨鱼可以吃掉别的体型小于它的鱼。具体来说,假设当前鲨鱼的体型为 x ,而另一条鱼的体型为 y ;如果 x > y,那么鲨鱼就可以消灭它,并让自己的体型变为 x + y 。
鲨鱼可以自由地在网格中上下左右的移动,且移动步数不受限制。当鲨鱼试图移动到一个已经有其他鱼的格子里时,鲨鱼就会尝试吃掉它;如果鲨鱼无法吃掉它,那么鲨鱼就无法进入它所占据的那一格。
现在,请问鲨鱼最多吃掉的鱼的数量,以及鲨鱼最终的体型的最大值?
Input
第一行,输入两个整数n , m ,表示网格的大小
第二行,输入两个整数s,t,代表代表鲨鱼的位置
接下来n行,每行输入m个正整数;其中s行t列为鲨鱼的初始体型
Output
输出一行两个整数,分别表示鲨鱼最多吃掉的鱼的数量,以及鲨鱼最大的体型
Example
input:
3 3
2 2
8 1 2
7 2 5
6 5 1
output:
2 5
第一步:设计 struct 网格 与 struct 鲨鱼
*以下为部分代码,文章最后将给出完整程序
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct Matrix{
int matrix[MAXSIZE][MAXSIZE];
int x;
int y;
};
struct shark{
int x;
int y;
int killnum;
int size;
};
第二步:读取网格信息
网格第一列与第一行,以及未录入数据的行与列默认值为0,表示为网格边缘
例:
g.matrix[0][0]的值为0;
void creatMatrix(Matrix &g){
for(int i=1;i<=g.x;i++)
for(int j=1;j<=g.y;j++)
cin>>g.matrix[i][j];
}
第三步:设计“吃”函数
鲨鱼将从初始位置上下左右开吃,并且标记这一轮已吃过的网格
这一轮已“吃”过的网格将在此轮不在前往
void eat(Matrix &g,shark &a,int flag){
int x,y;
x=a.x;
y=a.y;
if (a.size>g.matrix[a.x][a.y+1] && g.matrix[a.x][a.y+1]!=0 && g.matrix[a.x][a.y+1]>flag){
if (g.matrix[a.x][a.y+1]>0) {
a.size+=g.matrix[a.x][a.y+1];
a.killnum++;
}
g.matrix[a.x][a.y+1]=flag;
a.y++;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x][a.y-1] && g.matrix[a.x][a.y-1]!=0 && g.matrix[a.x][a.y-1]>flag){
if (g.matrix[a.x][a.y-1]>0) {
a.size+=g.matrix[a.x][a.y-1];
a.killnum++;
}
g.matrix[a.x][a.y-1]=flag;
a.y--;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x+1][a.y] && g.matrix[a.x+1][a.y]!=0 && g.matrix[a.x+1][a.y]>flag){
if (g.matrix[a.x+1][a.y]>0) {
a.size+=g.matrix[a.x+1][a.y];
a.killnum++;
}
g.matrix[a.x+1][a.y]=flag;
a.x++;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x-1][a.y] && g.matrix[a.x-1][a.y]!=0 && g.matrix[a.x-1][a.y]>flag){
if (g.matrix[a.x-1][a.y]>0) {
a.size+=g.matrix[a.x-1][a.y];
a.killnum++;
}
g.matrix[a.x-1][a.y]=flag;
a.x--;
eat(g,a,flag);
}
}
第四步:判断是否达到最大体型
鲨鱼将一轮一轮的循环“吃”,直到鲨鱼的体型不在增加。
int flag=-1,Size;
while (1) {
Size=a.size;
eat(g,a,flag);
flag--;
if(a.size==Size) break;
}
第五步:录入鲨鱼初始数据,整理程序逻辑
int main()
{
Matrix g;
cin>>g.x>>g.y;
shark a={0,0,0,0}; //初始化
cin>>a.x>>a.y;
creatMatrix(g);
a.size=g.matrix[a.x][a.y];
g.matrix[a.x][a.y]=-1;
int flag=-1,Size;
while (1) {
Size=a.size;
eat(g,a,flag);
flag--;
if(a.size==Size) break;
}
cout<<a.killnum<<" "<<a.size<<endl;
return 0;
}
完整代码
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct Matrix{
int matrix[MAXSIZE][MAXSIZE];
int x;
int y;
};
struct shark{
int x;
int y;
int killnum;
int size;
};
void creatMatrix(Matrix &g){
for(int i=1;i<=g.x;i++)
for(int j=1;j<=g.y;j++)
cin>>g.matrix[i][j];
}
void eat(Matrix &g,shark &a,int flag){
int x,y;
x=a.x;
y=a.y;
if (a.size>g.matrix[a.x][a.y+1] && g.matrix[a.x][a.y+1]!=0 && g.matrix[a.x][a.y+1]>flag){
if (g.matrix[a.x][a.y+1]>0) {
a.size+=g.matrix[a.x][a.y+1];
a.killnum++;
}
g.matrix[a.x][a.y+1]=flag;
a.y++;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x][a.y-1] && g.matrix[a.x][a.y-1]!=0 && g.matrix[a.x][a.y-1]>flag){
if (g.matrix[a.x][a.y-1]>0) {
a.size+=g.matrix[a.x][a.y-1];
a.killnum++;
}
g.matrix[a.x][a.y-1]=flag;
a.y--;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x+1][a.y] && g.matrix[a.x+1][a.y]!=0 && g.matrix[a.x+1][a.y]>flag){
if (g.matrix[a.x+1][a.y]>0) {
a.size+=g.matrix[a.x+1][a.y];
a.killnum++;
}
g.matrix[a.x+1][a.y]=flag;
a.x++;
eat(g,a,flag);
}
a.x=x;
a.y=y;
if (a.size>g.matrix[a.x-1][a.y] && g.matrix[a.x-1][a.y]!=0 && g.matrix[a.x-1][a.y]>flag){
if (g.matrix[a.x-1][a.y]>0) {
a.size+=g.matrix[a.x-1][a.y];
a.killnum++;
}
g.matrix[a.x-1][a.y]=flag;
a.x--;
eat(g,a,flag);
}
}
//检验函数
void show(shark &a){
cout<<a.x<<" "<<a.y<<" "<<a.killnum<<" "<<a.size;
}
void show(Matrix &g){
for(int i=1;i<=g.x;i++){
for(int j=1;j<=g.y;j++){
cout<<g.matrix[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
Matrix g;
cin>>g.x>>g.y;
shark a={0,0,0,0};
cin>>a.x>>a.y;
creatMatrix(g);
a.size=g.matrix[a.x][a.y];
g.matrix[a.x][a.y]=-1;
int flag=-1,Size;
while (1) {
Size=a.size;
eat(g,a,flag);
flag--;
if(a.size==Size) break;
}
cout<<a.killnum<<" "<<a.size<<endl;
show(g);
return 0;
}
以上为全部内容,祝你在学习道路上如履平地 ^_*
标签:matrix,递归,弱肉强食,int,鲨鱼,flag,&&,size 来源: https://blog.csdn.net/faroh/article/details/118729931