HDU2553 - n皇后(回溯法)

题目 :在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 
你的任务是,对于给定的N,求出有多少种合法的放置方法。
小白里的一道题,回溯法,之前没有将数据打成表,超时了,后来百度到大神打表的做法,代码如pre() {...} 
N个皇后,恰号N行,每行放一个皇后,queue[i]=j即表示第i+1行的皇后正处再第j+1列上,然后皇后位置定下来后,看看会不会攻击其他皇后,即位置是否合理,出现不合理的情况,就换个位置继续,若合理,就安排下一个皇后的位置...
 
代码如下:
#include <iostream>
int n;
int cnt;
int number[10];
int queen[10];
void search(int cur) {
	int i, j;
	if (cur == n) 
		cnt++;
	else {
		for (i = 0; i < n; i++) {
			queen[cur] = i;
			int ok = 1;
			for (j = 0; j < cur; j++) {
				if (queen[j] == queen[cur] || cur - queen[cur] == j - queen[j] || cur + queen[cur] == j + queen[j]) {
					ok = 0;
					break;
				}
			}
			if (ok)
			     search(cur + 1);
	     }
	}
}
void pre() {
	int i;
	for (i = 1;i <= 10;i++) {
		n = i;
		cnt = 0;
		search(0);
		number[n] = cnt;
	}
}
int main() {
	pre();
	while (scanf_s("%d", &n) && n!= 0) {	
		printf("%d\n",number[n]);
	}
	return  0;
}
    原文作者:回溯法
    原文地址: https://blog.csdn.net/conatic/article/details/50283321
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞