江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。
当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。
请问最少需要多少步,大钉才能骑着马跳到终点。
输入格式:
有多组测试样例。
每组第一行输入两个数 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<cmath> #include<algorithm> #include<queue> using namespace std; int r[8][2]={1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1}; char e[105][105]; int vis[105][105]; struct node{ int x,y,s; }; int n,m,sx,sy,ex,ey,flag; void bfs(){ queue<node> q; node u; u.x=sx;u.y=sy;u.s=0; vis[u.x][u.y]=1; q.push(u); while(!q.empty()){ node u=q.front();q.pop(); if(u.x==ex&&u.y==ey){ if(u.s==0) break; printf("%d\n",u.s); flag=1; break; } node v; for(int i=0;i<8;i++){ v.x=u.x+r[i][0]; v.y=u.y+r[i][1]; int xx=u.x+r[i][0]/2; int yy=u.y+r[i][1]/2; if(e[xx][yy]=='#') continue; if(v.x>=0&&v.x<n&&v.y>=0&&v.y<m&&e[v.x][v.y]!='#'&&!vis[v.x][v.y]){ v.s=u.s+1; q.push(v); vis[v.x][v.y]=1; } } } if(flag==0) { printf("-1\n"); } } int main(){ while(~scanf("%d%d",&n,&m)){ memset(e,0,sizeof(e)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin >>e[i][j]; if(e[i][j]=='s'){ sx=i;sy=j; } if(e[i][j]=='e'){ ex=i;ey=j; } } } flag=0; bfs(); } return 0; }