马走日

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

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

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

输入格式:

有多组测试样例。

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

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

输出格式:

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

样例1

输入:

3 3
s..
...
..e

3 3
s#.
...
#.e

输出:

4
-1
下过象棋, 还是很好理解的 ;
#include <queue>
#include <cstdio>
#include <cstring>
#define N 110
char G[N][N];
int v[N][N], n, m;
int transx[8]={1, -1, 1, -1, 2, -2, 2, -2};
int transy[8]={2, 2, -2, -2, 1, 1, -1, -1};
struct maze
{
    int x, y, step;
} r, s, t;
using namespace std;
int bfs(int x, int y)
{
    queue<maze> q;
    r.x= x; r.y= y; r.step=0;
    v[x][y]= 1;
    q.push(r);
    while(!q.empty())
    {
        s=q.front(); q.pop();
        if(G[s.x][s.y]=='e')
            return s.step;
        for(int i=0; i< 4; i++)
        {
            t=s;
            t.x=t.x+ transx[i]; int x=t.x; 
            t.y=t.y+ transy[i]; int y=t.y; 
            t.step+=1;
           
            if(x>=0 && x<n && y>= 0 && y < m && !v[x][y] && G[x][y] != '#' && G[x-transx[i]][y-transy[i]/2] != '#')
            { 
                //if(G[x][y]=='e') return t.step;
                q.push(t);
                v[x][y]=1;
            }
        }
        for(int i=4; i< 8; i++)
        {
            t=s;
            t.x=t.x+ transx[i]; int x=t.x; 
            t.y=t.y+ transy[i]; int y=t.y; 
            t.step+=1;
            
            if(x>=0 && x<n && y>= 0 && y < m && !v[x][y] && G[x][y] != '#' && G[x-transx[i]/2][y-transy[i]] != '#')
            {
                //if(G[x][y]=='e') return t.step;
                q.push(t);
                v[x][y]=1;
            }
        }
    }
    return -1;
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        int initx, inity;
        for(int i=0; i<n; i++)
        {
            scanf("%s", G[i]);
            for(int j=0; j<m; j++){
                if(G[i][j]== 's'){initx= i; inity= j; }
            }
        }
        memset(v, 0, sizeof(v));
        printf("%d\n", bfs(initx, inity));
    }
    return 0;
}

 

posted on 2016-04-25 20:31  cleverbiger  阅读(414)  评论(0)    收藏  举报