利用全排列算法八皇后问题和正方体摆数使三组面顶点之和相等问题

全排列算法解决思路见上一篇博客,这里贴出应用全排列算法解决两个问题的思路和代码:

八皇后问题:

在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。

#include <iostream>
int number = 0;
void swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}
bool check(int* array, int length) {
	for (int i = 0; i < length; i++)
		for (int j = i + 1; j < length; j++)
			if ((i - j == array[i] - array[j])
					|| (j - i == array[i] - array[j]))
				return false;

	return true;
}
bool checkSame(int* array, int p, int begin) {
	while (p > begin) {
		if (array[p] == array[begin])
			return false;
		begin++;
	}
	return true;
}
void permutation(int* array, int length, int begin) {
	if (begin == length - 1) {
		if (check(array, length)) {
			number++;
		}
	} else {
		for (int k = begin; k < length; k++) {
			if (checkSame(array, k, begin)) {
				swap(array[k], array[begin]);
				permutation(array, length, begin + 1);
				swap(array[k], array[begin]);
			}

		}
	}
}
void printPermutation(int* array, int length) {
	if (array == NULL)
		return;
	permutation(array, length, 0);
}

int main() {
	int array[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
	printPermutation(array, 8);
	std::cout << number << std::endl;
	return 0;
}


#include <iostream>
void swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}
bool checkSame(int* array, int p, int begin) {
	while (p > begin) {
		if (array[p] == array[begin])
			return false;
		begin++;
	}
	return true;
}
void permutation(int* array, int length, int begin) {
	if (begin == length - 1)
		if ((array[0] + array[1] + array[2] + array[3])
				== (array[4] + array[5] + array[6] + array[7])
				&& (array[0] + array[2] + array[4] + array[6])
						== (array[1] + array[3] + array[5] + array[7])
				&& (array[0] + array[1] + array[4] + array[5])
						== (array[2] + array[3] + array[6] + array[7])) {
			for (int i = 0; i < length; i++) {
				std::cout << array[i] << '\t';
			}
			std::cout << std::endl;
		} else {

		}

	else {
		for (int k = begin; k < length; k++) {
			if (checkSame(array, k, begin)) {
				swap(array[k], array[begin]);
				permutation(array, length, begin + 1);
				swap(array[k], array[begin]);
			}

		}
	}
}
void printPermutation(int* array, int length) {
	if (array == NULL)
		return;
	permutation(array, length, 0);
}

int main() {
//	测试代码
	int array[8] = { 1, -1, -1, 1, 1, -1, -1, 1 };
	printPermutation(array, 8);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值