大钉骑马走江湖
题意:
样例输入
3 3
s..
…
..e
3 3
s#.
…
#.e
样例输出
4
-1
思路: 简单的广搜问题,用的STL 中的队列模板
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
int i,j;
int x0,y0,x_end,y_end,cout_;
typedef struct Node
{
int ii;
int jj;
char c;
int nn;
}node;
int dirc[2][8]={1,1,-1,-1,2,2,-2,-2,2,-2,2,-2,1,-1,1,-1};
node map[100][100];
bool visited[100][100];
void bfs()
{
int k;
int a,b,cc,d;
int step=0;
queue<node>q;
q.push(map[x0][y0]);
node temp;
visited[x0][y0]=true;
while(!q.empty())
{
temp=q.front();
q.pop();
for(k=0;k<8;k++)
{
a=temp.ii+dirc[0][k];
b=temp.jj+dirc[1][k];
if(a>0&&a<=n&&b>0&&b<=m&&!visited[a][b])
{
cc=temp.ii+dirc[0][k]/2;
d=temp.jj+dirc[1][k]/2;
if(map[cc][d].c!='#'&&map[a][b].c!='#')
{
visited[a][b]=true;
map[a][b].nn=temp.nn+1;
if(map[a][b].c=='e')
{
cout<<map[a][b].nn<<endl;
return ;
}
q.push(map[a][b]);
}
}
}
}
cout<<-1<<endl;
}
int main()
{
char a;
while(cin>>n>>m)
{
cout_=0;
memset(visited,false,sizeof(visited));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>a;
map[i][j].nn=0;
map[i][j].c=a;
map[i][j].ii=i;
map[i][j].jj=j;
if(map[i][j].c=='s')
{
x0=i;
y0=j;
}
if(map[i][j].c=='e')
{
x_end=i;
y_end=j;
}
} bfs();
}
return 0;
}