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;
    }
  • 相关阅读:
    PHP $_SERVER 变量
    $_SERVER变量 以及 PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
    Funs
    搞定,务必记得要以最简便的整合资源来做
    还是要好好研究开源的php
    重回编程
    登录弹窗代码(居中)
    测试工具了解指南
    工作总结1
    HTML5 contextmenu隐藏鼠标右键菜单
  • 原文地址:https://www.cnblogs.com/pk28/p/5427241.html
Copyright © 2011-2022 走看看