zoukankan      html  css  js  c++  java
  • sicily 1781 Knight

    Description

    Your task is to write a program to calculate the minimum number of moves needed for a knight to reach one point from another. The possible knight moves are shown in Figure 1.


    Figure 1  Possible knight moves on the board

    Input

    The first line contains an integer T (≤10), indicating the number of test cases.

    In every case, the first line contains an integer N (≤500), indicating the size of the chess board (the entire board has size N  × N). The second and third line contain pair of integers (srcR, srcC), and (dstR, dstC), specifying the starting and ending position of the knight on the board (0 ≤ srcR, srcC, dstR, dstC ≤ N – 1).

    Output

    For every case, output the minimum distance on a single line. If starting point and ending point are equal, distance is 0. If the knight can’t reach the ending point, distance is -1.

    Sample Input

    2
    1
    0 0
    0 0
    10
    0 1
    8 9

    Sample Output

    0
    6

    分析:

    简单的BFS查找,注意判断状态是否合法即可。

    代码:

     1 // Problem#: 1781
     2 // Submission#: 1896080
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include <iostream>
     7 #include <queue>
     8 #include <cstring>
     9 using namespace std;
    10 
    11 #define MAX 500
    12 
    13 struct node{
    14     int x, y, z;
    15     node(int r, int s, int t){
    16         x = r;
    17         y = s;
    18         z = t;
    19     }
    20 };
    21 
    22 int n, a, b, c, d;
    23 bool visit[MAX][MAX];
    24 int move[8][2] = {{-2, -1}, {-1, -2}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {1, -2}, {2, -1}};
    25 
    26 inline bool judge(int x, int y){
    27     return x >= 0 && x < n && y >= 0 && y < n;
    28 }
    29 
    30 int bfs(){
    31     queue<node> buffer;
    32     memset(visit, false, sizeof(visit));
    33     buffer.push(node(a, b, 0));
    34     visit[a][b] = true;
    35     while (!buffer.empty()) {
    36         node tmp = buffer.front();
    37         if (tmp.x == c && tmp.y == d) 
    38             return tmp.z;
    39         buffer.pop();
    40         for (int i = 0 ; i < 8 ; ++i) {
    41             int tx = tmp.x + move[i][0];
    42             int ty = tmp.y + move[i][1];
    43             int tz = tmp.z + 1;
    44             if (judge(tx, ty) && !visit[tx][ty]){
    45                 buffer.push(node(tx, ty, tz));
    46                 visit[tx][ty] = true;
    47             }
    48         }
    49     }
    50     return -1;
    51 }
    52 
    53 int main() {
    54     int t;
    55     cin >> t;
    56     while (t--) {
    57         cin >> n;
    58         cin >> a >> b >> c >> d;
    59         cout << bfs() << endl;
    60     }
    61     return 0;
    62 }
  • 相关阅读:
    Centos7 系统别名设置
    C#编程 JSON操作
    C#编程 XML文档
    C#编程 socket编程之TcpClient,TcpListener,UdpClient
    C#编程 socket编程之udp服务器端和客户端
    C#编程 socket编程之unity聊天室
    C#编程 socket编程之tcp服务器端和客户端
    C#编程 线程,任务和同步(2) 开启线程
    C#编程 线程,任务和同步(1) 基础认识
    C#编程 LINQ查询
  • 原文地址:https://www.cnblogs.com/ciel/p/2876827.html
Copyright © 2011-2022 走看看