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