N皇后问题

N皇后问题

分析

每行的皇后放置都会影响其他位置的皇后,那么我们可以在每一行尝试这一行的每个位置,看能否找到合适的位置放置皇后。

模拟我们现实放置的情况,我们从第一行开始放置,尝试这第一行的每个位置,合适了就放置,然后开始放置下一行,直到放完N行。

然后再重新更换前面没有尝试过的位置,继续重复上面的操作。

定义

代码中我使用第0行表示现实中的第1行

我们使用一个名为queenPos数组的数组存放每一行皇后放置的位置
一个整型n表示N皇后的N,即有多少行

int queenPos[100];	//下标表示行数(从0开始),假定行数n最多不超过100
int n;	//n皇后,表示棋盘有n行n列

当前位置是否合适的判断语句

if (queenPos[当前行以前的行] == 当前行的位置 || 绝对值(当前行 - 当前行以前的行) == 绝对值(queenPos[当前行以前的行] - 当前行的位置))

代码

#include <iostream>
#include <cmath>

using namespace std;

int queenPos[100];	//下标表示行数(从0开始),假定行数n最多不超过100
int n;	//n皇后,表示棋盘有n行n列

//k表示当前在找第k行皇后的摆放位置
void Nqueen(int k) {
	//因为我们这里k是从0开始的,所以当k等于n时,说明前面n行皇后被摆放好位置了
	if (k == n) {
		//输出摆放位置
		for (int i = 0; i < n; i++)
			cout << queenPos[i] + 1 << " ";	//这里的+1是为了输出的行数符合人们日常的理解,从1开始到n
		cout << endl;

		return;
	}
	else {
		int j;

		//i代表当前第k行的第i列
		for (int i = 0; i < n; i++) {
			for (j = 0; j < k; j++)	//j表示当前第k行的前面行数
				//当前这行的第i个位置不能与前面放置的皇后放在同一列和对角线上
				if (queenPos[j] == i || abs(k - j) == abs(queenPos[j] - i))
					break;

			//如果j等于k,那么在上面的循环里找到了合适的放置位置
			if (j == k) {
				queenPos[k] = i;	//记录当前这行皇后放置的位置
				Nqueen(k + 1);		//拜访后一行的皇后
			}
		}
	}
}


int main() {
	cin >> n;
	Nqueen(0);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值