zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JavaScript与C# Windows应用程序交互
    SVG与CSS的特殊性
    Flash 仪表控件 FusionGadgets【转】
    如何获取Windows服务对应程序的所在目录
    记录几个CSS样式
    使用网络调试助手时出现 connect() failed 错误
    使用xml配置文件配置DataGridView的列信息
    javascript解析json
    iPhone开发笔记
    (转)C语言中两种方式表示时间日期值time_t和struct tm类型的相互转换
  • 原文地址:https://www.cnblogs.com/pk28/p/5427241.html
Copyright © 2011-2022 走看看