/*
本算法是著名的八皇后求解问题,可以求解不带障碍的八皇后问题,也可求解带障碍的八皇后问题。
修改本方法主函数 int main()中的n的数值可以求解对应的皇后问题,同时对于a[length]中对应位置初始化时进行修改可以实现对于带障碍的八皇后问题的求解。
障碍使用0来表示,无障碍使用1来表示
*/
#include <stdio.h>
#include <iostream>
using namespace std;
#define length 1000
int a[length];
void Blocked1(int a[length],int i, int n, int iterations) {
int target = 0;
target = iterations * n + i;
target--;
while (target > iterations * n) {
a[target] = 0;
target--;
}
}
void Blocked2(int a[length],int i, int n, int iterations) {
int target = 0;
target = iterations * n + i;
target++;
while (target < ((iterations+1) * n+1 )) {
a[target] = 0;
target++;
}
}
void Blocked3(int a[length],int i, int n, int iterations) {
int target = 0;
target = iterations * n + i;
target = target - n;
while (target > 0) {
a[target] = 0;
target = target - n;
}
}
void Blocked4(int a[length],int i, int n, int iterations) {
int target = 0;
target = iterations * n + i;
target = target + n;
while (target < (n * n + 1)) {
a[target] = 0;
target = target + n;
}
}
void Blocked5(int a[length],int i, int n, int iterations) {
int target = 0;
int number = 1;
target = iterations * n + i;
target = target - n - 1;
while ((target>0)&&(target>((iterations-number)*n))&& (target < ((iterations-number+1 ) * n+1))) {
a[target] = 0;
target = target - n - 1;
number++;
}
}
void Blocked6(int a[length],int i, int n, int iterations) {
int target = 0;
int number = 1;
target = iterations * n + i;
target = target - n + 1;
while ((target > 0) && (target > ((iterations -number) * n)) && (target < ((iterations-number+1)*n+1))) {
a[target] = 0;
target = target - n + 1;
number++;
}
}
void Blocked7(int a[length],int i, int n, int iterations) {
int target = 0;
int number = 1;
target = iterations * n + i;
target = target + n - 1;
while ((target < n*n+1) && (target > ((iterations + number) * n)) && (target < ((iterations+number+1)*n+1))) {
a[target] = 0;
target = target + n - 1;
number++;
}
}
void Blocked8(int a[length],int i, int n, int iterations) {
int target = 0;
int number = 1;
target = iterations * n + i;
target = target + n + 1;
while ((target < n * n + 1) && (target > ((iterations + number) * n)) && (target < ((iterations+number+1)*n + 1))) {
a[target] = 0;
target = target + n + 1;
number++;
}
}
void Blocked_location(int a[length],int i, int n, int iterations) {
Blocked1(a,i, n, iterations);
Blocked2(a,i, n, iterations);
Blocked3(a,i, n, iterations);
Blocked4(a,i, n, iterations);
Blocked5(a,i, n, iterations);
Blocked6(a,i, n, iterations);
Blocked7(a,i, n, iterations);
Blocked8(a,i, n, iterations);
}
int Location(int a[], int n, int iterations) {
int flag1 = 0;
int c[length];
for (int i = 1; i < n + 1; i++) {
for (int j = 0; j < n * n + 1; j++) {
c[j] = a[j];
}
if (iterations == (n - 1)) {
if (c[iterations * n + i] == 1) {
flag1++;
}
}
else {
if (c[iterations * n + i] == 1) {
//封禁位置
Blocked_location(c, i, n, iterations);
//迭代次数加一
iterations++;
//进行迭代
int b[length];
for (int j = 0; j < n * n + 1; j++) {
b[j] = c[j];
}
flag1=flag1+Location(b,n, iterations);
iterations--;
}
}
}
return flag1;
}
int main() {
int n, iterations = 0,target=0;
int a[length];
int k = 0;
n = 8;
for (int i = 1; i < n*n+1; i++) {
a[i] = 1;
}
target=Location(a, n, iterations);
cout << target;
}
05-02
1419