大钉骑马走江湖

来源:互联网 发布:知乎 校园招聘 文案 编辑:程序博客网 时间:2024/04/27 11:18

江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。

当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。

请问最少需要多少步,大钉才能骑着马跳到终点。

输入格式:

有多组测试样例。

每组第一行输入两个数 nn 和 mm,代表矩阵的行数和列数,2 \leq n \leq m < 1002nm<100

接下来输入 nn 行字符串,其中 's' 代表起点,'e' 代表终点,'.' 代表空地,'#' 代表障碍物。

输出格式:

对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 -11

样例1

输入:

3 3s.......e3 3s#....#.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;}


0 0
原创粉丝点击