弱肉强食(递归)


前言

第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;
}


以上为全部内容,祝你在学习道路上如履平地 ^_*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值