DFS:多米诺骨牌游戏

问题描述:

多米诺骨牌的游戏规则是这样的:推倒一张骨牌,由于连锁反应和它有关的多米诺骨牌都会相应倒下。谁推倒的骨牌数量多,谁就是赢家。但今天我们把规则改变一下,我们引入一张特殊的骨牌“の”,最后推倒的骨牌是这张牌的人为赢家。


输入部分:

每组测试先给出2个正整数n,m(2<=n,m<=10)表示有一个有n*m个单元的矩阵。矩阵里的每一个小单元代表一个多米

骨牌(西红柿也是一种多米诺骨牌)。接着有n行,每行有m个整数。每个单元里的整数grid[i][j]表示的是推倒该单

上的多米诺骨牌它会向哪个方向倒下。我们假定矩阵的左上角(1,1)是西北方向。最后有2个正整数表示推倒

第一张多米诺骨牌的位置。

grid[i][j]=: 

1 表示向北倒;

2 表示向南倒;

3 表示向东倒;

4 表示向西倒;

5 表示是の骨牌,游戏结束。



输出部分:

对于每组测试判断最后一张多米诺骨牌是不是の骨牌,是输出"Good";否则输出"My God"。

Sample Input 
4 4
3 3 3 2
3 3 2 2
1 5 4 2
1 4 4 4
1 1
4 4
3 3 3 2
4 5 3 2
1 1 4 2
1 4 4 4
1 1 


Sample Output 
Good

My God 


分析:DFS。以第一张被推倒的骨牌为起点直接模拟搜索即可。只需在原来的深搜中加入一个判断语句就行了,即如果搜索的这点的值为1,就只需搜索(x-1,y)这个点即可;如果这点的值为2,则搜索(x+1,y);值为3搜索(x,y+1);值为4搜索(x,y-1);如果这点的值为0或者5,则搜索停止,然后输出答案即可。值为5时很好理解,因为搜到了の骨牌;那为什么值为0时也要停止呢?答案很显然,我们在main函数中用0初始化了存放骨牌的数组,如果搜索搜到了这点的值为0,那么只能说明这点在骨牌方阵之外,搜索出界了!

实现代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int map[15][15];
bool s[15][15];
int dfs(int x,int y)
{
    s[x][y]=true;
    if(map[x][y]==5||!map[x][y]) return map[x][y];
    if(map[x][y]==1&&!s[x-1][y]) return dfs(x-1,y);
    if(map[x][y]==2&&!s[x+1][y]) return dfs(x+1,y);
    if(map[x][y]==3&&!s[x][y+1]) return dfs(x,y+1);
    if(map[x][y]==4&&!s[x][y-1]) return dfs(x,y-1);
    return 0;
}
int main()
{
    int n,m,sx,sy;
    while(scanf("%d%d",&n,&m)!=-1)
    {
        memset(map,0,sizeof(map));
        memset(s,false,sizeof(s));
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            scanf("%d",&map[i][j]);
        scanf("%d%d",&sx,&sy);
        if(dfs(sx,sy))  puts("Good");
        else puts("My God");
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值