这道题目 首先得看懂题目意思,还有一个就是 知道怎么判断 该点在你点的附近,
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <queue>
using namespace std;
const int N=30;
char s[N][N];
int n,m;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int fir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int visit[N][N][N][N];
int x,y,x2,y2;
struct node
{
int zx,zy,sx,sy;
int step;
};
int bfs()
{
int i;
queue<node>q;
node cur,next;
cur.zx=x2;
cur.zy=y2;
cur.sx=x;
cur.sy=y;
cur.step=0;
visit[cur.zx][cur.zy][cur.sx][cur.sy]=1;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
if(abs(cur.zx-cur.sx)+abs(cur.zy-cur.sy)<2)
{
return cur.step;
}
for(i=0; i<4; i++)
{
next.zx=cur.zx+dir[i][0];
next.zy=cur.zy+dir[i][1];
if(next.zx<0||next.zx>=n||next.zy<0||next.zy>=m||s[next.zx][next.zy]=='X')continue;
next.sx=cur.sx+fir[i][0];
next.sy=cur.sy+fir[i][1];
if(next.sx<0||next.sx>=n||next.sy<0||next.sy>=m||s[next.sx][next.sy]=='X')
{
next.sx=cur.sx;
next.sy=cur.sy;
}
if(visit[next.zx][next.zy][next.sx][next.sy])continue;
next.step=cur.step;
visit[next.zx][next.zy][next.sx][next.sy]=1;
next.step++;
q.push(next);
}
}
return -1;
}
int main()
{
int i,j,flag1,flag2;
while(scanf("%d%d",&n,&m)!=EOF)
{
flag1=0;
flag2=0;
for(i=0; i<n; i++)
scanf("%s",&s[i]);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(s[i][j]=='S')
{
x=i;
y=j;
flag1=1;
}
if(s[i][j]=='Z')
{
x2=i;
y2=j;
flag2=1;
}
if(flag1&&flag2)break;
}
if(flag1&&flag2)break;
}
memset(visit,0,sizeof(visit));
int num;
num=bfs();
if(num<0)printf("Bad Luck!\n");
else
printf("%d\n",num);
}
return 0;
}