首页 > 代码库 > 八皇后问题(回溯)
八皇后问题(回溯)
+ View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #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; } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。