全排列算法解决思路见上一篇博客,这里贴出应用全排列算法解决两个问题的思路和代码:
八皇后问题:
在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;
}