zoukankan      html  css  js  c++  java
  • A Knight's Journey (DFS)

    Background 
    The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey 
    around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans? 

    Problem 
    Find a path such that the knight visits every square once. The knight can start and end on any square of the board.

    Input

    The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .

    Output

    The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number. 
    If no such path exist, you should output impossible on a single line.

    Sample Input

    3
    1 1
    2 3
    4 3

    Sample Output

    Scenario #1:
    A1
    
    Scenario #2:
    impossible
    
    Scenario #3:
    A1B3C1A2B4C2A3B1C3A4B2C4
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<set>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<algorithm>
    #include<cstdio>
    #include<algorithm>
    #include<functional>
    #include<sstream>
    int n1, n2;
    int xx[30], yy[30];
    int visit[30][30];
    int flag;
    int dir[8][2] = { { -2,-1 },{ -2,1 },{ -1,-2 },{ -1,2 },{ 1,-2 },{ 1,2 },{ 2,-1 },{ 2,1 } };
    int go(int x, int y)
    {
        if (1 <= x&&x <= n1 && 1 <= y&&y <= n2)
            return 1;
        return 0;
    }
    void dfs(int x, int y, int num)
    {
        int i, xxx, yyy;
        xx[num] = x;
        yy[num] = y;
        if (num == n1*n2)
        {
            flag = 1;
            return;
        }
        for (i = 0; i<8; i++)
        {
            xxx = x + dir[i][0];
            yyy = y + dir[i][1];
            if (go(xxx, yyy) && !visit[xxx][yyy] && !flag)
            {
                visit[xxx][yyy] = 1;
                dfs(xxx, yyy, num + 1);
                visit[xxx][yyy] = 0;
            }
        }
    }
    int main()
    {
        int i, k, t;
        scanf("%d", &t);
        for (k = 1; k <= t; k++)
        {
            scanf("%d%d", &n2, &n1);
            memset(visit, 0, sizeof(visit));
            visit[1][1] = 1;
            flag = 0;
            dfs(1, 1, 1);
            printf("Scenario #%d:
    ", k);
            if (flag)
            {
                for (i = 1; i <= n1*n2; i++)
                    printf("%c%d", xx[i] + 'A' - 1, yy[i]);
            }
            else
                printf("impossible");
            printf(k == t ? "
    " : "
    
    ");
        }
        return 0;
    }
  • 相关阅读:
    Java设计模式之工厂模式的两种实现方式
    1.揭开消息中间件RabbitMQ的神秘面纱
    再谈spring的循环依赖是怎么造成的?
    深入理解java反射原理
    关于springmvc的helloworld的压测报告
    线程池工厂Executors编程的艺术
    lazy-init 懒加载的艺术
    spring中的mybatis的sqlSession是如何做到线程隔离的?
    java并发机制锁的类型和实现
    ReentrantReadWriteLock 读写锁解析
  • 原文地址:https://www.cnblogs.com/edych/p/7246868.html
Copyright © 2011-2022 走看看