八皇后问题

/*
	八皇后问题:要在一个8*8的国际象棋几盘中放8个皇后,
				使任意两个皇后都不能互相吃掉。规则是
				皇后能吃掉偶同一行、同一列、统一对角
				线的任意棋子,求所有的解 
*/ 

#include<iostream>
#include<stdio.h>
using namespace std;

int a[21];
int n = 16;

bool check(int row);
void outputResult();
void eightQueue(int k);

long long times;// 次数 

int main() {
//	for (a[1] = 1; a[1] <= n; a[1]++) {
//		for (a[2] = 1; a[2] <= n; a[2]++) {
//			if (!check(2)) continue;// 如果当前位置不合适,继续往右挪
//			for (a[3] = 1; a[3] <= n; a[3]++) {
//				if(!check(3)) continue;
//				for (a[4] = 1; a[4] <= n; a[4]++) {
//					if (!check(4)) continue;
//					printf("(1, %d) (2, %d) (3, %d) (4, %d)\n", a[1], a[2], a[3], a[4]);
//				}
//			}	
//		} 
//	}
	
//	int k = 1;
//	a[k] = 0; 
//	while (k) {
//		a[k]++;// a[k]初始值为零,故刚开始要加一
//		if (a[k] > n)// 如果突破了边界,说明上一个皇后的位置错误导致了
//			k--;	 // 接下来的皇后无法放置,故这里需要调整上一个皇后的位置(也就是回溯) 
//		else {
//			if (check(k)) {
//				if (k == n) {// 若最后一个皇后放置完毕,输出当前放置方案
//					outputResult();
//					cout << endl;
//				} 
//				else {
//					k++;// 继续放置下一个皇后
//					a[k] = 0;
//				}	
//			}
//		} 
//	}
	eightQueue(1);
	cout << times << endl; 
	
	return 0;
}

void eightQueue(int k) {// 递归实现 
	times++; 
	for (a[k] = 1; a[k] <= n; a[k]++) {
		if (check(k)) {
			if (k == n)// 假如到了最后一个皇后,就输出
				outputResult();
			else
				eightQueue(k + 1);// 放置下一个皇后
		}
	} 
}

bool check(int row) {
	// 检查当前位置与前面的位置是否冲突
	for (int i = 1; i < row; i++) {
		if (a[i] == a[row] || a[i] - i == 
			a[row] - row || a[i] + i == a[row] + row)
			return false; 
	} 
	return true;
}

void outputResult() {
	for (int i = 1; i <= n; i++) 
		cout << "(" << i << ", " << a[i] << ") "; 
	cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值