天神小学

可以把天神小学看作是一个二维的迷宫,每一秒都只能从当前位置走到上下左右四个相邻的格子里,因为天小一直在崩溃,所以有很多点是无法行走的。问班长能不能在天小完全崩溃,即t秒内逃出天神小学。

第一行一个整数T,表示数据组数

每组数据第一行输入3个整数nmt分别表示迷宫的行数,列数,以及距离天小崩溃剩余的时间。(3≤n,m≤20,t≤100)

接下来输入n行,每行有一个长度为m的字符串。

其中字符’.’表示可以通行

字符’*’表示无法通行

字符’O’表示出口

字符’X’表示班长的起始位置


若能逃离 输出 "happy end"

否则输出"bad end"

2

5 5 13
.....
.***.
.*X*O
.*.*.
...*.

5 5 14
.....
.***.
.*X*O
.*.*.
...*.

输出

bad end
happy end

宽度优先搜索。。。,用队列实现的方式





#include <cstdio>
#include <queue>
using namespace std;
int t;
int n;
int m;//n为行,m为列,t为时间
int bfs(int x,int y);
char  s[21][21];
typedef struct tianshen
{
    int c,d;//需要保存原来的节点的坐标
    int step;//相对应的步数
}tianshen;
int main()
 {
     int T,i,j,ans;
    scanf("%d",&T);
     while (T--)
     {
         scanf("%d%d%d",&n,&m,&t);
         for (i=0;i<n;i++)
         scanf("%s",s[i]);
         for (i=0;i<n;i++)
         for (j=0;j<n;j++)
         if (s[i][j]=='X')
         ans=bfs(i,j);
         if (ans<=t)
         printf("happy end\n");
         else
         printf("bad end\n");
     }
     return 0;
 }
 int bfs(int x,int y)
 {  
     queue<tianshen>q;
     int i;
     tianshen t,node;
     int a[4]={-1,1,0,0};//控制方向
     int b[4]={0,0,1,-1};
     node.step=0;//起始步数为0
     node.c=x;//起始设置
     node.d=y;
    q.push(node);
     while (!q.empty())
     {  
         node=q.front();//记录上一个节点
         q.pop();
     for (i=0;i<=3;i++)
    {
        t=node;//node用来保存原根节点
        t.c=t.c+a[i];
        t.d=t.d+b[i];
        t.step++;
    if (s[t.c][t.d]=='O') return t.step;
     if ((t.c<m)&&(t.c>=0)&&(t.d<n)&&(t.d>=0)&&(s[t.c][t.d]=='.'))
     {
         
         s[t.c][t.d]='*';
         q.push(t);//将符合条件的下一个子节点入队(其实与深搜的差别就是深搜立刻开始进入递归,而宽搜是先保存下来,等之前的结束了才轮到子节点)
     }
    }
     }
   return 10000;
 }
     
     
         
         
     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值