题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2076
这是一道典型的BFS题,可由题意知道起始点‘X’,结束位置‘O’, ‘.’是通路,‘* ’是断路,首先是如何输入图形,我选择的是二维字符数组 map,然后用二维数组vis表示这个点是否有走过,然后在BFS函数中使用队列,利用队列的先进先出原则,则当第一个到达出口的点的步数是最小的。最后再和输入的最小步数进行比较得出是否能够跑出天神小学。
具体代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=25;
char map[MAX][MAX];
int vis[MAX][MAX];
int dirtx[4]={1,-1,0,0}; //!
int dirty[4]={0,0,1,-1};
typedef struct point
{
int x,y;
int stepres;
}point;
int BFS(int x1,int y1,int n,int m)
{
memset(vis,0,sizeof(vis));
queue<point> q; //!
point node,t;
node.x=x1;
node.y=y1;
node.stepres=0;
vis[node.x][node.y]=1;
q.push(node);
while(!q.empty())
{
node=q.front();
q.pop();
for(int i=0;i<4;i++)
{
t=node;
t.x+=dirtx[i];
t.y+=dirty[i];
t.stepres++;
if(map[t.x][t.y]=='O')
return t.stepres;
if(t.x<1||t.y<1||t.x>m||t.y>n||map[t.x][t.y]=='*'||vis[t.x][t.y]==1)
{
continue;
}
else
{
vis[t.x][t.y]=1;
q.push(t);
}
}
}
}
int main()
{
int T;
cin>>T;
int n,m,t;
while(T--)
{
int step=0;
char s[25];
memset (map,0,sizeof(map));
memset (s,0,sizeof(0));
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
scanf("%s",s);
for(int j=1;j<=m;j++)
{
map[i][j]=s[j-1];
}
}
int x1,y1;//表示起始位置,压入队列中的第一个点
int out=0;
for(int i=1;i<=n;i++)//找到第一个点
{
for(int j=1;j<=m;j++)
{
if(map[i][j]=='X')
{
x1=i;
y1=j;
out=1;
break;
}
}
if(out==1)
break;
}
step=BFS(x1,y1,n,m);
if(step<=t)
{
cout<<"happy end"<<endl;
}
else
cout<<"bad end"<<endl;
}
return 0;
}
仅代表个人观点,欢迎交流探讨,勿喷~~~
图片来源:http://www.pixiv.net/member_illust.php?illust_id=50263455&mode=medium