• B


    ACM小组的Samsara和Staginner对中国象棋特别感兴趣,尤其对马(可能是因为这个棋子的走法比较多吧)的使用进行深入研究。今天他们又在 构思一个古怪的棋局:假如Samsara只有一个马了,而Staginner又只剩下一个将,两个棋子都在棋盘的一边,马不能出这一半棋盘的范围,另外这 一半棋盘的大小很奇特(n行m列)。Samsara想知道他的马最少需要跳几次才能吃掉Staginner的将(我们假定其不会移动)。当然这个光荣的任 务就落在了会编程的你的身上了。

    Input

    每组数据一行,分别为六个用空格分隔开的正整数n,m,x1,y1,x2,y2分别代表棋盘的大小n,m,以及将的坐标和马的坐标。(1<=x1,x2<=n<=20,1<=y1,y2<=m<=20,将和马的坐标不相同)

    Output

    输出对应也有若干行,请输出最少的移动步数,如果不能吃掉将则输出“-1”(不包括引号)。

    Sample Input

    8 8 5 1 4 5

    Sample Output

    3

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<string>
     6 #include<vector>
     7 #include<stack>
     8 #include<bitset>
     9 #include<cstdlib>
    10 #include<cmath>
    11 #include<set>
    12 #include<list>
    13 #include<deque>
    14 #include<map>
    15 #include<queue>
    16 #define ll long long
    17 #define inf 0x3fffffff
    18 using namespace std;
    19 struct Node
    20 {
    21     int x,y,step;
    22 };
    23 queue<Node> q;
    24 int n,m;
    25 int a[25][25];
    26 int vis[25][25];
    27 int d[][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
    28 
    29 bool check(int x,int y)
    30 {
    31     if(x<0||x>=n||y<0||y>=m)
    32         return false;
    33     if(vis[x][y])
    34         return false;
    35     return true;
    36 }
    37 int bfs(int x1,int y1,int x2,int y2)
    38 {
    39     memset(vis,0,sizeof(vis));
    40     q.push( (Node){x1,y1,0} );
    41     vis[x1][y1]=1;
    42     while(!q.empty())
    43     {
    44         Node u=q.front();
    45         q.pop();
    46         if(u.x==x2&&u.y==y2)//到达目标
    47         {
    48             return u.step;
    49         }
    50         for(int i=0;i<8;i++)//遍历八个方向
    51         {
    52              int x=u.x+d[i][0];
    53              int y=u.y+d[i][1];
    54              if(check(x,y))//检查边界
    55              {
    56                  vis[x][y]=1;
    57                  q.push(Node{x,y,u.step+1});//步数加1
    58              }
    59         }
    60     }
    61     return -1;//如果不能吃掉将则输出“-1”
    62 }
    63 
    64 int main()
    65 {
    66     int x1,y1,x2,y2;
    67     while(~scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2))
    68     {
    69         memset(vis,0,sizeof(vis));
    70        int ans= bfs(x2,y2,x1,y1);
    71         printf("%d
    ",ans);
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    java如何手动创建一个线程池
    HashMap的面试总结(摘抄)
    JDK源码调试
    分布式和集群的区别
    开发中model,entity和pojo的区别
    java并发编程_CountDownLanch(倒计数锁存器)应用场景
    Map 怎么排序
    java中Thread的 interrupt异常处理
    zookeeper节点失效重连机制
    java并发库_并发库知识点整理
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7404895.html
Copyright © 2020-2023  润新知