codeup墓地 八皇后

題目描述

會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。
對於某個滿足要求的8皇后的擺放方法,定義一個皇后串a與之對應,即a=b1b2…b8,其中bi爲相應擺法中第i行皇后所處的列數。已經知道8皇后問題一共有92組解(即92個不同的皇后串)。
給出一個數b,要求輸出第b個串。串的比較是這樣的:皇后串x置於皇后串y之前,當且僅當將x視爲整數時比y小。

輸入

第1行是測試數據的組數n,後面跟着n行輸入。每組測試數據佔1行,包括一個正整數b(1 <= b <= 92)

輸出

輸出有n行,每行輸出對應一個輸入。輸出應是一個正整數,是對應於b的皇后串。

樣例輸入

3
6
4
25

樣例輸出

25713864
17582463
36824175

C++代碼

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 8;			//八皇后問題 
int P[9] = { 0 };			//存放一組正確的解法
char ans[93][9] = { 0 };	//存放最終結果,以一個數字形式展現 
bool hashTable[N + 1];		//散列,以空間換時間,由於數字不能重複,需要這麼一個標記作爲重複與否判斷標記 
int count = 1;				//表示當前是按字典從小到大排序第幾個解 
int temp = 0;
/*
 * 八皇后問題主體函數和按字典從小到大實現1~n全排列本質上是一致的
 * 1~N全排列可以看拆分成:“1”開頭的全排列,“2”開頭的全排列等等,然後以此類推,
 * 在上面分類基礎上已經確定第一個位置數字了 ,再從後一位置繼續相同的分治
 */
void generate(int index) {
	if (index == N + 1) {
		for (int t = 1; t <= N; t++) {
			ans[count][t - 1] = P[t] + '0';
		}
		count++;
		return;
	}
	/*
	 * 當皇后放在index列 第x行時
	 * 判斷對角線是否滿足要求,不滿足則結束
	 * 滿足要求則遞歸,判斷後一位置
	 * 注:index位置的行號是從1~N迭代的
	 */
	for (int x = 1; x <= N; x++) {
		if (hashTable[x] == false) {
			bool flag = true;
			for (int pre = 1; pre < index; pre++) {
				//這裏判斷是否在同一對角線 
				if (abs(index - pre) == abs(x - P[pre])) {
					flag = false;
					break;
				}
			}
			if (flag) {
				P[index] = x;
				hashTable[x] = true;
				generate(index + 1);
				//這裏要還原,x確定情況下,之後位置所有情況都遍歷過了,要進行x++,開始下一輪遞歸
				hashTable[x] = false;
			}
		}
	}
}

int main() {
	memset(hashTable, 0, sizeof(hashTable));
	generate(1);
	int n, b;
	while (cin >> n) {
		for (int i = 0; i < n; i++) {
			cin >> b;
			cout << ans[b] << endl;
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章