Journey Chevalier (Les DSF)

La description

 

Contexte 
Le chevalier s'ennuie de voir les mêmes carrés noirs et blancs encore et encore

et a décidé de faire un voyage autour du monde.

Boring veulent Voyage

Chaque fois qu'un chevalier se déplace, il est deux carrés dans une direction et une perpendiculaire à cette place.

Se déplace: deux carrés dans une direction, une perpendiculaire à celui-ci carré. (En fait, il est de prendre le jour!)

Le monde d'un chevalier est le jeu d'échecs, il vit sur.

Le monde est un damier de sa vie

Notre chevalier vit sur un échiquier qui a une superficie inférieure à un 8 régulier * 8 conseil d'administration,

Nous vivons le roi sur le plateau, il y a une zone moins conventionnelle 8x8 checkerboard.

mais il est toujours rectangulaire.

Toujours le rectangle

Pouvez - vous aider ce chevalier aventureux à faire des plans de voyage? 

Problème 
Trouver un chemin tel que les visites de chevalier chaque carré une fois. Le chevalier peut commencer et se terminer sur une place du conseil d' administration.

A travers chaque lieu, vous pouvez commencer fin / en tout lieu du conseil d'administration

Contribution

L'entrée commence par un entier positif n dans la première ligne.

Les lignes suivantes contiennent des cas de test n.

cas de test n

Chaque cas de test se compose d'une seule ligne avec deux entiers positifs p et q, tel que 1 <= p * q <= 26.

Chaque cas d'utilisation est p q et p, q> = 1 q <= 26

Cela représente ap * q chessboard,

Cela représente p · q * chessboard

où p décrit combien de nombres différents carrés 1,. . . , P exist,

q décrit comment existent plusieurs lettres carrées.

Ce sont les premières lettres q de l'alphabet latin: A,. . .

Production

La sortie pour chaque scénario commence par une ligne contenant « Scénario n ° i: »,

où i est le numéro du scénario à partir de 1.

Ensuite, imprimez une seule ligne contenant le chemin lexicographique d'abord que des visites toutes les cases de l'échiquier avec des mouvements de chevalier suivi d'une ligne vide.

Le chemin doit être donnée sur une seule ligne en enchaînant les noms des places visitées.

Chaque nom carré se compose d'une lettre majuscule suivi d'un numéro. 
Si un tel chemin existe, vous devriez sortie impossible sur une seule ligne.

Exemple d'entrée

3
1 1
2 3
4 3

Exemple de sortie

Scenario #1:
A1

Scenario #2:
impossible

Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4

 

Note optimiste, cet ordre est très important, sinon wa!

X représentant abcd axe y représente 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;
		}

	}

}

 

 

Publié 85 articles originaux · louanges gagnées 0 · Vues 3628

Je suppose que tu aimes

Origine blog.csdn.net/bijingrui/article/details/104782732
conseillé
Classement