toj 1702A Knight's Journey

it2022-05-09  29


1702.   A Knight's Journey
Time Limit: 1.0 Seconds    Memory Limit: 65536K    Multiple test files
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 Problem ID in problemset: 1702
Submit   Back   Runs   Statistics   Clarifications
// 639397 2009-05-16 16:21:32 B C 1.2K 0'00.00" 668K forever4444  // #include <stdio.h> int  t; int  main() {     scanf( " %d " , & t);      int  p,q,zz = 1 ;      while (t -- )     {         scanf( " %d%d " , & p, & q);         printf( " Scenario #%d:\n " ,zz ++ );          if (p == 1 && q == 1 )             printf( " A1\n " );          else   if (p == 3 && q == 4 )             printf( " A1C2A3B1D2B3C1A2C3D1B2D3\n " );          else                if (p == 3 && q == 7 )             printf( " A1B3D2F1G3E2G1F3E1G2E3C2A3B1C3A2C1D3B2D1F2\n " );          else   if (p == 3 && q == 8 )             printf( " A1B3C1A2C3D1B2D3E1G2E3C2A3B1D2F1H2F3G1E2G3H1F2H3\n " );          else                if (p == 4 && q == 3 )             printf( " A1B3C1A2B4C2A3B1C3A4B2C4\n " );          else                if (p == 4 && q == 5 )             printf( " A1B3C1A2B4D3E1C2D4E2C3A4B2D1E3C4A3B1D2E4\n " );          else                if (p == 4 && q == 6 )             printf( " A1B3C1A2B4C2D4E2F4D3E1F3D2B1A3C4B2A4C3E4F2D1E3F1\n " );          else                if (p == 5 && q == 4 )             printf( " A1B3A5C4D2B1A3B5D4C2B4A2C1D3C5A4B2D1C3D5\n " );          else                if (p == 5 && q == 5 )             printf( " A1B3A5C4A3B1D2E4C5A4B2D1C3B5D4E2C1A2B4D5E3C2E1D3E5\n " );          else                if (p == 6 && q == 4 )             printf( " A1B3A5C6D4B5D6C4D2B1A3C2B4A2C1D3B2D1C3D5B6A4C5A6\n " );          else                if (p == 7 && q == 3 )             printf( " A1B3C1A2C3B1A3C2B4A6C7B5A7C6A5B7C5A4B2C4B6\n " );          else                if (p == 8 && q == 3 )             printf( " A1B3C1A2B4C2A3B1C3A4B2C4A5B7C5A6B8C6A7B5C7A8B6C8\n " );          else             printf( " impossible\n " );         printf( " \n " );     }      return   0 ; }

 

//比赛的时候自己错了一点,赛后交了是对的,唉,深搜一定要细心啊!!!!

// 639669 2009-05-16 19:27:22 Accepted 1702 C++ 1.7K 0'00.01" 1204K forever4444  // 不打表也是对的 #include  < iostream > #include  < stack > #define  MAX 27 using   namespace  std; bool  used[MAX][MAX],mark; int  sum,p,q,t; int  a[ 8 ][ 2 ] = {{ - 1 , - 2 },{ 1 , - 2 },{ - 2 , - 1 },{ 2 , - 1 },{ - 2 , 1 },{ 2 , 1 },{ - 1 , 2 },{ 1 , 2 }}; int  num; typedef  struct  node {      short  num;      char  ch;     node(){};     node( short  nn, char  ccc)     {         num = nn;         ch = ccc;     } }Point; stack < Point > S,RS; Point temp; void  Init() {     scanf( " %d%d " , & p, & q);      int  i,j;      for (i = 0 ;i < q;i ++ )          for (j = 0 ;j < p;j ++ )             used[i][j] = false ; } bool  Bound( int  x, int  y) {      if (x >= 0 && y >= 0 && x < p && y < q)          return   true ;      else          return   false ; } void  DFS( int  x, int  y, int  sum)  // x是列,y是行 {      int  i,j,tx,ty;      if (sum == p * q)     {         mark = true ;          return ;     }      for (i = 0 ;i < 8 ;i ++ )     {         tx = x + a[i][ 1 ];   // tx是列         ty = y + a[i][ 0 ];    // ty是行          if ( ! Bound(ty,tx) || used[tx][ty])         {              continue ;         }         used[tx][ty] = true ;         S.push(node(ty,( char )( ' A ' + tx)));         sum += 1 ;         DFS(tx,ty,sum);          if ( ! mark)             S.pop();          if (mark)              return  ;         used[tx][ty] = false ;         sum -= 1 ;     } } int  main() {      int  i,j;      int  zz = 1 ;     scanf( " %d " , & t);      while (t -- )     {         Init();         printf( " Scenario #%d:\n " ,zz ++ );         mark = false ;         num = 0 ;          for (i = 0 ;i < q;i ++ )         {              if (mark)                  break ;              for (j = 0 ;j < p;j ++ )             {                 used[i][j] = true ;                  while ( ! S.empty())                     S.pop();                 sum = 1 ;                 temp.ch = ( char )( ' A ' + i);                 temp.num = j;                 S.push(temp);                 DFS(i,j,sum);   // i是列,j是行                  if (mark)                      break ;                 used[i][j] = false ;             }         }          if ( ! mark)             printf( " impossible\n\n " );          else         {              while ( ! S.empty())             {                 temp = S.top();                 S.pop();                 RS.push(temp);             }              while ( ! RS.empty())             {                 temp = RS.top();                 RS.pop();                 printf( " %c%d " ,temp.ch,temp.num + 1 );             }             printf( " \n\n " );         }     }      return   0 ; }

转载于:https://www.cnblogs.com/forever4444/archive/2009/05/16/1458414.html


最新回复(0)