• POJ2488 A Knight's Journey


    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
    

    Source

    TUD Programming Contest 2005, Darmstadt, Germany

    要求字典序最小,那么暴力枚举起点然后DFS就行。沿途存下路径,最后转化成字符输出。

     1 /**/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 const int mxn=125;
     9 int vis[mxn][mxn];
    10 bool flag;
    11 int mx[9]={0,-2,-2,-1,-1,1,1,2,2},
    12     my[9]={0,-1,1,-2,2,-2,2,-1,1};
    13 int n,m;
    14 int qx[mxn],qy[mxn];
    15 void dfs(int x,int y,int cnt){
    16     qx[cnt]=x;qy[cnt]=y;
    17     vis[x][y]=1;
    18     if(cnt==m*n){
    19         flag=1;
    20         return;
    21     }
    22     for(int i=1;i<=8;i++){
    23         int nx=mx[i]+x;
    24         int ny=my[i]+y;
    25         if(nx<1 || nx>m || ny<1 || ny>n)continue;
    26         if(vis[nx][ny])continue;    
    27         dfs(nx,ny,cnt+1);
    28         if(flag)return;
    29     }
    30     vis[x][y]=0;
    31     return;
    32 }
    33 int main(){
    34     int T;
    35     scanf("%d",&T);
    36     int cas=0;
    37     for(cas=1;cas<=T;cas++){
    38         memset(vis,0,sizeof vis);
    39         flag=0;
    40         int i,j;
    41         scanf("%d%d",&n,&m);
    42         for(i=1;i<=m;i++){
    43             if(flag)break;
    44              for(j=1;j<=n;j++){
    45                  dfs(i,j,1);
    46                  if(flag)break;
    47              }
    48         }
    49         printf("Scenario #%d:
    ",cas);
    50         if(flag){
    51             for(i=1;i<=n*m;i++)printf("%c%d",qx[i]+'A'-1,qy[i]);
    52         }
    53         else printf("impossible");
    54         printf("
    ");
    55         if(cas<T)printf("
    ");
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    封装异常处理之坑
    30multipart/form-data和application/x-www-form-urlencoded的区别(二)urlencoded之自动deocde
    使用MAT时的Shallow Size和 Retained Size的区别
    当动态代理遇到ioc
    线程池的原理
    synchroned原理与对象头(yet)
    mysql压力测试与qps监控
    一种mysql jvm死锁
    Android Jni变量对照表
    结构体中使用函数指针
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5719432.html
Copyright © 2020-2023  润新知