八皇后问题(回溯)
#include<stdio.h> #include<stdlib.h> #include<math.h> #define N 8 int arr[N]; void queens(int *arr); int checkPosition(int *arr, int i); int main() { // 初始化数组 int i; for(i = 0; i < N; i++) { arr[i] = 0; } // 排列皇后 queens(arr); system("PAUSE"); return 0; } // 排列皇后 void queens(int *arr) { // 初始化变量 int i = 1; int j, k; // 有多少种解 int total = 0; while(i >= 1) { // 在下一个位置放置第 i 个皇后 arr[i] = arr[i] + 1; // 检查皇后放置的位置是否合法 while(arr[i] <= N && !checkPosition(arr, i)) { // 搜索下一列 arr[i] = arr[i] + 1; } //得到一个输出 if(arr[i] <=N&&i==N) { for(j = 1; j <= N; j++) { for(k = 1; k <= N; k++) { if(arr[j] == k) { printf(" *"); } else { printf(" ."); } } printf("\n"); } printf("\n"); total++; } else if(arr[i] <= N && i < N) { // 放置下一个皇后 ++i; } else { // 回溯 arr[i] = 0; --i; } } printf("There are %d answers!\n\n", total); } // 检查皇后 x 放在 arr[x] 位置是否会有冲突 int checkPosition(int *arr, int x) { int i; for(i = 1; i < x; i++) { if(arr[i] == arr[x] || abs(x - i) == abs(arr[x] - arr[i])) { return 0; } } return 1; }