N皇后问题
来源:互联网 发布:linux查看文件权限 编辑:程序博客网 时间:2024/06/06 10:52
n皇后问题:输入n,表示在n*n的棋牌上放n个皇后,要求皇后不同行、不同列、不同对角线。
解决思路:用二维数组表示棋盘,其值0代表没有放的位置、其值1代表放了皇后,从棋盘的第一行第一列开始找合适位置(由于找到位置直接进入下一行,故不用考虑同行的。由于从第一行开始,判断是否同对角线时只需考虑左上和右上),找到后进入下一行,未找到就回溯到上一行找,直到遍历所有的位置。
具体代码:
#include<iostream>#include<cstdio>#include<cstring>int qi[20][20];//用于构造棋盘int n,sum;//n棋盘大小,sum记录符合的个数int pan(int k,int i){ int j,t; for(j=0;j<k;j++)//判断同列是否有皇后 if(qi[j][i])return 0; for(j=k-1,t=i-1;j>=0&&t>=0;t--,j--)//判断左上是否有皇后 if(qi[j][t])return 0; for(j=k-1,t=i+1;j>=0&&t<n;t++,j--)//判断左上是否有皇后 if(qi[j][t])return 0; return 1;}void DSF(int k){ if(n==k) { for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { printf("%d ",qi[i][j]); } printf("\n"); } printf("\n\n"); sum++; return ; } for(int i=0;i<n;i++) { if(pan(k,i)){ qi[k][i]=1;//位置符合放皇后 DSF(k+1); qi[k][i]=0;//用于回溯 } }}int main(){ while(scanf("%d",&n)!=EOF) { memset(qi,0,sizeof(qi));//初始化棋盘(清理棋盘) sum=0; DSF(0);//从第一行开始找 printf("%d\n",sum); }return 0;}
阅读全文
1 0
- N*N皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N 皇后问题
- N皇后问题
- N皇后问题算法
- N 皇后问题
- N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N皇后问题优化
- N皇后问题
- n皇后问题
- N皇后问题
- 最大子矩阵题解
- 面试小结之Elasticsearch篇
- 快速排序
- ThinkPHP5 模板渲染
- TCP之使用带外数据的客户/服务器
- N皇后问题
- 线性近似
- aapt使用手册
- Kafka的安装和使用总结
- HDU 6059 Kanade's trio
- C++运算符的重载
- keepalived 配置文件参数详解
- 2016NOIP提高组DAY2T2 蚯蚓
- android UiAutomator自定义一个判断当前版本的方法