江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。
当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。
请问最少需要多少步,大钉才能骑着马跳到终点。
输入格式:
有多组测试样例。
每组第一行输入两个数 n 和 m,代表矩阵的行数和列数,2≤n≤m<100。
接下来输入 n 行字符串,其中 's' 代表起点,'e' 代表终点,'.' 代表空地,'#' 代表障碍物。
输出格式:
对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 −1。
样例1
输入:
3 3 s.. ... ..e 3 3 s#. ... #.e
输出:
4-1
bfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
char map1[110][110];
int vis[110][110];
int dir[8][2]= {{2,1},{-2,1},{2,-1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
int s1,e1,s2,e2;
int n,m;
struct node
{
int x,y;
int step;
};
void run(int x,int y)
{
if(map1[x+1][y]=='#')
{
if(x+2<n &&y+1<m)
vis[x+2][y+1]=1;
if(x+2<n &&y-1>=0)
vis[x+2][y-1]=1;
}
if(map1[x-1][y]=='#')
{
if(x-2>=0 &&y+1<m)
vis[x-2][y+1]=1;
if(x-2>=0 &&y-1>=0)
vis[x-2][y-1]=1;
}
if(map1[x][y-1]=='#')
{
if(x+1<n &&y-2>=0)
vis[x+1][y-2]=1;
if(x-1>=0 &&y-2>=0)
vis[x-1][y-2]=1;
}
if(map1[x][y+1]=='#')
{
if(x+1<n &&y+2<m)
vis[x+1][y+2]=1;
if(x-1>=0 &&y+2<m)
vis[x-1][y+2]=1;
}
}
void run1(int x,int y)
{
if(map1[x+1][y]=='#')
{
if(x+2<n &&y+1<m)
vis[x+2][y+1]=0;
if(x+2<n &&y-1>=0)
vis[x+2][y-1]=0;
}
if(map1[x-1][y]=='#')
{
if(x-2>=0 &&y+1<m)
vis[x-2][y+1]=0;
if(x-2>=0 &&y-1>=0)
vis[x-2][y-1]=0;
}
if(map1[x][y-1]=='#')
{
if(x+1<n &&y-2>=0)
vis[x+1][y-2]=0;
if(x-1>=0 &&y-2>=0)
vis[x-1][y-2]=0;
}
if(map1[x][y+1]=='#')
{
if(x+1<n &&y+2<m)
vis[x+1][y+2]=0;
if(x-1>=0 &&y+2<m)
vis[x-1][y+2]=0;
}
}
int bfs(int x,int y)
{
queue<node>q;
node st,ed;
st.x=x;
st.y=y;
st.step=0;
q.push(st);
while(!q.empty())
{
st=q.front();
run(st.x,st.y);
q.pop();
if(st.x==s2 &&st.y==e2)
return st.step;
for(int i=0; i<8; i++)
{
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
if(ed.x>=0 &&ed.x<n &&ed.y>=0 &&ed.y<m &&vis[ed.x][ed.y]==0 )
{
ed.step=st.step+1;
vis[ed.x][ed.y]=1;
q.push(ed);
}
}
run1(st.x,st.y);
}
return -1;
}
int main()
{
while(cin>>n>>m)
{
int i,j;
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
cin>>map1[i];
for(j=0; j<m; j++)
if(map1[i][j]=='s')
{
s1=i;
e1=j;
}
else if(map1[i][j]=='e')
{
s2=i;
e2=j;
}
else if(map1[i][j]=='#')
vis[i][j]=1;
}
int ans=bfs(s1,e1);
cout<<ans<<endl;
}
return 0;
}