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.

无聊了 想旅行

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

走法:一个方向的2个方格,垂直于此的一个正方形。(其实就是走日!)

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,

我们国王生活在棋盘上,有一个  比常规8 * 8棋盘小的区域。

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.

n个测试用例

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

每个用例是 p  q    并且   p、q >= 1 q<=26

This represents a p * q chessboard,

这代表p·* q棋盘

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

注意看好,这个顺序 非常重要,否则wa!

x代表abcd   y轴代表 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;
		}

	}

}
发布了85 篇原创文章 · 获赞 0 · 访问量 3628

猜你喜欢

转载自blog.csdn.net/bijingrui/article/details/104782732
今日推荐