这道题有个错误就是输入时必须得用gets()或者scanf("%s")

Code
/*
HDU2216 15ms 812k
*/
#include<iostream>
#include<algorithm>
#include<queue>
#define N 22
#define ANAL -1
using namespace std;
int stepx[]={0,1,-1,0};
int stepy[]={1,0,0,-1};
int zx,zy,sx,sy;//对应z和s的开始坐标
int n,m;
char map[N][N];
int dist[N][N][N][N];//存储当前(BFS例程中)z到s的长度
bool check(int zx,int zy,int sx,int sy)//检查是Z否与S相邻(x+y=1)或重合(x+y=0)
{
int x,y;
x=abs(zx-sx);
y=abs(zy-sy);
if(x+y<2)
return true;
else
return false;
}
int BFS()
{
queue<int>Q;
int tzx,tzy,tzx2,tzy2;
int tsx,tsy,tsx2,tsy2;
if(check(zx,zy,sx,sy))
return 0;
Q.push(zx);
Q.push(zy);
Q.push(sx);
Q.push(sy);
while(!Q.empty())
{
tzx=Q.front();Q.pop();
tzy=Q.front();Q.pop();
tsx=Q.front();Q.pop();
tsy=Q.front();Q.pop();
for(int i=0;i<4;i++)
{
tzx2=tzx+stepx[i];
tzy2=tzy+stepy[i];
if(!(map[tzx2][tzy2]=='.'))
continue;
tsx2=tsx-stepx[i];
tsy2=tsy-stepy[i];
if(!(map[tsx2][tsy2]=='.')) {tsx2=tsx;tsy2=tsy;}
if(check(tzx2,tzy2,tsx2,tsy2))
return dist[tzx][tzy][tsx][tsy]+1;
if(dist[tzx2][tzy2][tsx2][tsy2]!=-1)
continue;
Q.push(tzx2);
Q.push(tzy2);
Q.push(tsx2);
Q.push(tsy2);
dist[tzx2][tzy2][tsx2][tsy2]=dist[tzx][tzy][tsx][tsy]+1;
}
}
while(!Q.empty())
Q.pop();
return -1;
}
void Init()//初始化,这里有个技巧,就是map下标从1开始使用,目的是为了在图的周围围成一圈墙,省去每次判断坐标是否越界
{
memset(map,'X',sizeof(map));//围墙
memset(dist,-1,sizeof(dist));//距离初始化
getchar();
for(int i=1;i<=n;i++)
{
gets(map[i]+1);
for(int j=1;j<=m;j++)
{
if(map[i][j]=='Z'){zx=i;zy=j;map[i][j]='.';}
else if(map[i][j]=='S'){sx=i;sy=j;map[i][j]='.';}
}
}
dist[zx][zy][sx][sy]=0;//起点
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
Init();
int res;
res = BFS();
if(res==-1)
puts("Bad Luck!");
else
printf("%d\n",res);
}
return 0;
}
几个测试数据:
2 2
Z.
.S
4 4
.Z..
.X..
....
XS..
4 4
.Z..
.X..
....
.SXX
4 4
X..S
..X.
.X..
.Z..
4 4
X..S
....
.X..
.Z..