B.大钉骑马走江湖

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

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

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

输入格式:

有多组测试样例。

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

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

输出格式:

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

样例1

输入:

3 3
s..
...
..e

3 3
s#.
...
#.e

输出:

4
-1

bfs题目。注意要有vis数组。

/* ***********************************************
Author        :guanjun
Created Time  :2016/4/24 15:14:21
File Name     :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;

char mp[120][120];
int n,m;
struct node{
    int x,y,dis;
};
int sx,sy,ex,ey;
int dir[8][2]={
    1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1
};
int vis[120][120];
void bfs(){
    cle(vis);
    queue<node>q;
    node u={sx,sy,0};
    q.push(u);
    int mark=0;
    while(!q.empty()){
        node u=q.front();
        q.pop();
        //cout<<u.x<<" "<<u.y<<endl;
        if(u.x==ex&&u.y==ey){
            if(u.dis==0)break;
            cout<<u.dis<<endl;
            mark=1;
            break;
        }
        node v;
        for(int i=0;i<8;i++){
            v.x=u.x+dir[i][0];
            v.y=u.y+dir[i][1];
            int nx=u.x+dir[i][0]/2;
            int ny=u.y+dir[i][1]/2;
            if(mp[nx][ny]=='#')continue;
            if(v.x<n&&v.x>=0&&v.y>=0&&v.y<m&&(mp[v.x][v.y]!='#')&&!vis[v.x][v.y]){
                v.dis=u.dis+1;
                q.push(v);
                vis[v.x][v.y]=1;
            }
        }

    }
    if(mark==0){
        cout<<-1<<endl;
    }
}
int main()
{
   // #ifndef ONLINE_JUDGE
   // freopen("in.txt","r",stdin);
   // #endif
    //freopen("out.txt","w",stdout);
    while(cin>>n>>m){
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>mp[i][j];
                if(mp[i][j]=='s'){
                    sx=i,sy=j;
                }
                else if(mp[i][j]=='e'){
                    ex=i;ey=j;
                }
            }
        }
        bfs();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pk28/p/5427241.html