• POJ 2488 A Knight's Journey


    A Knight's Journey
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 44532   Accepted: 15139

    Description

    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

    分析:
    朝8个方向进行的DFS搜索,主要的是要记录 路径,考虑到深搜的性质,故采用结构体,最后一次更新完成的路径即使最终的路径
    这个表示位置的坐标的时候还有字母,字母表示位置是相当不方便的。所以先都采用数字 ,输出的时候再化为字母。

    代码如下
    #include <cstdio>
    #include <iostream>
    #include  <cstring >
    using namespace std;
    #define INF 0x7fffffff
    typedef long long ll;
    int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
    int  p,q;
    int map1[100][100];
    int f,step;
    int vis[100][100];
    int check(int x,int y)
    {
      if(x>=0&&x<p&&y>=0&&y<q&&!vis[x][y])
      return 1;
      return 0;
    }
    struct node
    {
        int x;
        int y;
    }path[1000];
    void dfs(int x,int y)
    {
        if(f==1)
        return ;
        path[step].x=x;
        path[step].y=y;
        if(step==p*q-1)
        {
          f=1;
        }
        int next_x;
        int next_y;
        for(int i=0;i<8;i++)
        {
            next_x=path[step].x+dir[i][1];
            next_y=path[step].y+dir[i][0];
            if(check(next_x,next_y))
            {
                vis[next_x][next_y]=1;
                step++;
                dfs(next_x,next_y);
                    step--;
                 vis[next_x][next_y]=0;
            }
        }
    }
    int main()
    {
        int t;
        cin>>t;
        for(int k=1;k<=t;k++)
        {
            f=0;
            step=0;
            memset(map1,0,sizeof(map1));
          cin>>p>>q;
        {
          std::ios::sync_with_stdio(false);
           
         }
         dfs(0,0);
         vis[0][0]=1;
         printf("Scenario #%d:
    ",k);
         if(f==0)cout<<"impossible";
         else 
         {
             for(int i=0;i<p*q;i++)
             {
                 printf("%c",'A'+path[i].y);
                 printf("%d",path[i].x+1);
             }
         }
         cout<<endl;
         cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    java代码split分割数字类
    P1330 封锁阳光大学
    1022 舞会2
    1626 爱在心中
    P2024 食物链(two)
    P1196 银河英雄传说
    P1892 团伙
    P1546 最短网络(最小生成树)
    烦人的幻灯片(拓扑)
    例4.15 奖金(拓扑排序)
  • 原文地址:https://www.cnblogs.com/a249189046/p/6642438.html
Copyright © 2020-2023  润新知