大钉骑马走江湖 北京林业大学校赛。

来源:互联网 发布:股票价值分析软件 编辑:程序博客网 时间:2024/05/17 02:28

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

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

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

输入格式:

有多组测试样例。

每组第一行输入两个数 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 <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;}

0 0
原创粉丝点击