A Knight's Journey(dfs)

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.

Boring want to travel

Whenever a knight moves, it is two squares in one direction and one square perpendicular to this.

Moves: two squares in one direction, a square perpendicular thereto. (In fact, it is to take the day!)

The world of a knight is the chessboard he is living on.

The world is a checkerboard of his life

Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board,

We live the king on the board, there is a less than conventional 8x8 checkerboard area.

but it is still rectangular.

Still the rectangle

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.

Through each place, you can start / end at any place of the board

Input

The input begins with a positive integer n in the first line.

The following lines contain n test cases.

n test cases

Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26.

Each use case is p q and p, q> = 1 q <= 26

This represents a p * q chessboard,

This represents 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

 

Note optimistic, this order is very important, otherwise wa!

Representative x abcd y-axis represents 1234

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

typedef struct Path {
	int y;
	int x;
} Path;

Path path[1001];

bool isFound = false;
int p,q;
bool mark[51][51];

int dir[8][2] = {
	{-1,-2},
	{1,-2},
	{-2,-1},
	{2,-1},
	{-2,1},
	{2,1},
	{-1,2},
	{1,2},
};


// p * q
bool isInMap(int ny,int nx) {


	if (nx >= 1 && nx <= q && ny >= 1 && ny <= p) {
		return 1;
	}
	return 0;
}

void dfs(int y,int x,int step) {
//	cout << "current:" << y <<" "<< x << endl;
	if (step == p * q) {
//		cout << "out!!! :" << step << endl;
		for (int i = 1; i <= step; i ++) {
			cout << char(path[i].x + 'A' - 1) << path[i].y;
		}
		cout << endl;
		isFound = 1;
		return ;
	}


	int ny;
	int nx;

	for (int i = 0; i <= 7; i++) {
		ny = y + dir[i][0];
		nx = x + dir[i][1];

		if (isFound == 0) {
			if (isInMap(ny,nx) == 1 && mark[ny][nx] == 0) {
				path[step+1].y = ny;
				path[step+1].x = nx;
				mark[ny][nx] = 1;
				// dfs
				dfs(ny,nx,step+1);
				// 回溯
				mark[ny][nx] = 0;
			}
		}


	}


}


int main() {

	int caseNum;
	cin >> caseNum;
	for (int caseNo = 1; caseNo <= caseNum; caseNo++) {
		cin >> p >> q;
		isFound = false;

		for (int i = 1; i <= p ; i++) {
			for (int j = 1; j <= q; j++) {
				mark[i][j] = 0;
			}
		}

		path[1].y = 1;
		path[1].x = 1;
		mark[1][1] = 1;

		cout << "Scenario #" << caseNo << ":" <<endl;
		dfs(1,1,1);

		if (!isFound) {
			cout << "impossible" << endl << endl;
		} else {
			cout << endl;
		}

	}

}

 

 

Published 85 original articles · won praise 0 · Views 3628

Guess you like

Origin blog.csdn.net/bijingrui/article/details/104782732