A Knight ' s Journey
Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 31702 |
|
Accepted: 10813 |
Description
Background
The knight is getting bored of seeing, the same black and white squares again and again and have decided to make a journey
Around the world. Whenever a knight moves, it is the squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he was living on. Our knight lives in a chessboard that have a smaller area than a regular 8 * 8 board, but it's still rectangular. Can 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 on the first line. The following lines contain n test cases. Each of the test case consists of a single line with the 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 Ho W many different square letters exist. These is the first Q letters of the Latin alphabet:a, ...
Output
The output for every scenario begins with a line containing "scenario #i:", where I am the number of the scenario starting at 1. Then print a single line containing thelexicographicallyFirst path that visits all squares of the chessboard with Knight moves followed by a empty line. The path should is given on a, the names of the visited squares by concatenating. Each square name is consists of a capital letter followed by a number.
If no such path exist, you should output impossible on a.
Sample Input
31 12 34 3
Sample Output
Scenario #1: A1scenario #2: Impossiblescenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
Test instructions: Chess. Then give a horse (horse walking day), can start from a random point, to find a way to access all the lattice (P*Q board) path, note that the path is assumed to have multiple output dictionary order the smallest.。
then this can be searched by the dictionary order search.
。
is the search direction to be fixed. Not at liberty to write.
Then nothing else is going to go deep. Return directly after searching the answer;
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include < string> #include <cctype> #include <vector> #include <cstdio> #include <cmath> #include < deque> #include <stack> #include <map> #include <set> #define LL long long#define MAXN 116#define pp pair<int,int> #define INF 0x3f3f3f3f#define max (x x > (y))? (x): (y)) #define min (x, y) ((() > (y))? (y): (x)) using namespace Std;int n,m,k,ans,dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; BOOL Vis[27][27];int sx[30],sy[30],top,ok;void dfs (int x,int y) {if (OK) return; if (top==n*m) {ok=1;for (int i=0;i<top; i++) printf ("%c%d", ' A ' +sy[i]-1,sx[i]); return;} for (int i=0;i<8;i++) {int Tx=x+dir[i][0];int ty=y+dir[i][1];if (tx>=1&&tx<=n&&ty>=1 &&ty<=m&&!vis[tx][ty]) {Vis[tx][ty]=1;sx[top]=tx;sy[top++]=ty;dfs (tx,ty); vis[tx][ty]=0;top-- ;}}} int main () {int t,cas=1;scanf ("%d", &t); while (t--) {scanf ("%d%d", &n,&m), ok=0;printf ("Scenario #%d:\n", cas++); memset (vis,0,sizeof (Vis)); Top=0;vis [1] [1]=1;sx[top]=1;sy[top++]=1;dfs], if (!ok) printf ("Impossible");p UTS (""); if (T) puts ("");} return 0;}
POJ 2488-a knight& #39; s Journey (DFS)