天神小学

来源:互联网 发布:欧莱雅淘宝旗舰店假货 编辑:程序博客网 时间:2024/04/20 15:57

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