算法导论 · 回溯算法 · n皇后问题

  • 源代码
#include <cstdio> 
#include <cmath> 
#include <algorithm>
using namespace std;

const int n = 8;
int x[n + 1], num = 0; //皇后的位置用列值来表示,下标为行数,值为列 

bool isPlace(int k) {
	for(int i = 1; i < k; i++) {
		if(x[i] == x[k] || (abs(x[i] - x[k]) == abs(i - k))) {
			return false;
		}
	}
	return true;
}

void NQueens() {
	int k = 1;
	while(k >= 1) {
		x[k]++;
		while(x[k] <= n && (!isPlace(k))) x[k]++; //第k行第x[k]列不能放, 
		if(x[k] <= n) {
			if(k < n) {
				k++;
			} else {
				num++;
				for(int i = 1; i <= n; i++) {
					printf("(%d, %d) ", i, x[i]);
				}
				printf("\n");
			}
		} else {
			x[k--] = 0; //当前行不能放,归0且回到上一行 
		}
	}
}


void NQueensR(int k) { //递归 
	x[k] = 0;
	while(1) {
		x[k]++;
		while(x[k] <= n && (!isPlace(k))) x[k]++; //第k行第x[k]列不能放, 
		if(x[k] <= n) {
			if(k < n) {
				NQueensR(k + 1);
			} else {
				num++;
				for(int i = 1; i <= n; i++) {
					printf("(%d, %d) ", i, x[i]);
				}
				printf("\n");
			}
		} else {
			return; 
		}
	}
}


int main() {
	fill(x, x + n + 1, 0);
	NQueens(); //非递归 
	printf("%d\n", num);
	fill(x, x + n + 1, 0);
	num = 0; 
	NQueensR(1); //递归 
	printf("%d\n", num);
	return 0;
}
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97566269