BFS — 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 —— 大钉骑马走江湖

来源:互联网 发布:淘宝分享链接打不开 编辑:程序博客网 时间:2024/05/06 08:38

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

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

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

输入格式:

有多组测试样例。

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

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

输出格式:

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

样例1

输入:

3 3s.......e3 3s#....#.e

输出:

4-1

简单BFS,注意象棋中马的走法,走“日”


#include<stdio.h>#include<string.h>#include<string.h>#include<iostream>#include<queue>using namespace std;char s[110][110];int sx,sy,ex,ey,n,m;int vis[120][120];const int c[8][2]={1,2,1,-2,-1,-2,-1,2,2,1,2,-1,-2,-1,-2,1};struct node {    int x,y,step;};int bfs(int tx,int ty){    memset(vis,0,sizeof(vis));    int ans=0;    node t,tmp;    t.x=tx; t.y=ty; t.step=0;    queue<node> q;    q.push(t);    while(!q.empty()){        t=q.front();        q.pop();        if(t.x==ex && t.y==ey){            if(t.step==0)   break;            printf("%d\n",t.step);            ans=1;            break;        }        for(int i=0;i<8;i++){            tmp.x=t.x+c[i][0];            tmp.y=t.y+c[i][1];            int fx=t.x+c[i][0]/2;            int fy=t.y+c[i][1]/2;            if(s[fx][fy]=='#')  continue;            if(tmp.x>=0 && tmp.x<n && tmp.y>=0 && tmp.y<m && s[tmp.x][tmp.y]!='#' && !vis[tmp.x][tmp.y]){                q.push(tmp);                vis[tmp.x][tmp.y]=1;                tmp.step=t.step+1;            }        }    }    if(!ans)    printf("-1\n");}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                cin>>s[i][j];                if(s[i][j]=='s'){                    sx=i;                    sy=j;                }                if(s[i][j]=='e'){                    ex=i;                    ey=j;                }            }        }        bfs(sx,sy);    }    return 0;}






0 0
原创粉丝点击