可以把天神小学看作是一个二维的迷宫,每一秒都只能从当前位置走到上下左右四个相邻的格子里,因为天小一直在崩溃,所以有很多点是无法行走的。问班长能不能在天小完全崩溃,即t秒内逃出天神小学。
第一行一个整数T,表示数据组数
每组数据第一行输入3个整数n,m,t分别表示迷宫的行数,列数,以及距离天小崩溃剩余的时间。(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;
}