N皇后(C语言)
任务描述
本关任务:国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。该题要求N皇后的放置结果共有多少种。
相关知识
回溯法
测试说明
平台会对你编写的代码进行测试:
输入描述:输入一个正整数N(N小于16)
输出描述:输出结果
例 测试输入:8
预期输出:92
解析:
放置皇后时,对所有列进行遍历,并且一一判断能不能进行放置。可以放置便进行递归,一种方法成功后回溯寻找下一种。
//下面编写代码 #include <stdio.h> #include <stdlib.h> #define N 16 int q[N]; // 下标为皇后的行号,值为列号 int count = 0; // 统计解得个数// 检验第i行的k列上是否可以摆放皇后 int find(int i,int k) {int j=1;while(j<i) // 通过前面已放置皇后的行来判断这一列是否可以放置{// 第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上if(q[j]==k ||abs(j-i)==abs(q[j]-k))return 0; // 不能放置j++;}return 1; // 可以放置 } // 放置皇后到棋盘上 void place(int k,int n) {int j;if(k>n) // 终止条件count++; // 终止代表一种放法实现,计数加一else{for(j=1;j<=n;j++) // 试探第k行的每一个列{if(find(k,j)){q[k] = j; // 存入皇后存放的行列属性place(k+1,n); // 递归}}} }int main(void) {int n;scanf("%d",&n); place(1,n);printf("%d", count);return 0; }总结
- 上一篇: 刺激战场怎么获取创建房间权限
- 下一篇: 韩信走马分油(C语言)