八皇后问题--递归求解
2016-03-29 21:08
393 查看
八皇后问题简述:在国际象棋中,皇后是最厉害的(这也就是大概为什么不要得罪女人的原因),她可以吃掉任意与其所在列和行,以及对角线上的棋子。所以在8X8的棋盘上,安放8个皇后,使得不会相互攻击,也就是安全的就变得极为重要。本文采用递归的方式,输出所有的92种可能的方法。代码如下:
#include "stdafx.h" #include "windows.h" //#include "cnoio.h" int count =0; int notDanger(int row,int j,int (*chess)[8]){ int i=0,k;int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; for(i=0;i<8;i++)//列 { if(*(*(chess+i)+j) !=0){ flag1 = 1; break; } } for(i=row,k=j;i>=0 && k>=0;i--,k--)//左上方 { if(*(*(chess+i)+k) !=0){ flag2 = 1; break; } } for(i=row,k=j;i<8 && k<8;i++,k++)//右下方 { if(*(*(chess+i)+k) !=0){ flag3 = 1; break; } } for(i=row,k=j;i>=0 && k<8;i--,k++)//右上方 { if(*(*(chess+i)+k)!=0){ flag4 = 1; break; } } for(i=row,k=j;i<8&&k>=0;i++,k--)//右下方 { if(*(*(chess+i)+k)!=0){ flag5 = 1; break; } } if(flag1||flag2||flag3||flag4||flag5){ return 0; }else{ return 1; } } void Eightqueen(int row,int n,int (*chess)[8]) { int copyChess[8][8];int i,j; for( i =0;i<8;i++) { for( j =0;j<8;j++) copyChess[i][j]=chess[i][j]; } if(row==8) { printf("第 %d 种\n",++count); for(i =0;i<8;i++) { for( j =0;j<8;j++) printf("%d ",copyChess[i][j]); printf("\n"); } printf("\n"); } else{ for(int j =0;j< n;j++){ if(notDanger(row,j,chess)){ for(int i =0;i<8;i++) *(*(copyChess+row)+i)= 0; *(*(copyChess+row)+j)= 1; Eightqueen(row+1,n,copyChess); } } } } int _tmain(int argc, _TCHAR* argv[]) { //system("color FA"); int chess[8][8]; int i=0,j; for(i=0;i<8;i++) for(j=0;j<8;j++) chess[i][j] =0; Eightqueen(0,8,chess); getchar(); return 0; }
相关文章推荐
- Delphi的没落有三个原因(比较贴切)
- Atom插件安装
- MES中的松耦合设计一例
- tesseract 3.04:vs2013 / vs2015 + 64 + win7 + charlesw 的代码
- 人生没有最佳时刻
- 人生没有最佳时刻
- 使用 CPUID 查询 CPU 信息
- Android 自定义View (一)
- 进程间通信(一):竞争条件与互斥方案
- Web Listener --- 精确地监控在线用户的状态
- 开发android应用需要掌握哪些知识呢?
- BZOJ 3050: [Usaco2013 Jan] Seating
- 梯度下降法,最小二乘法求线性回归
- 格式化
- 第四周项目1 求两个数的最大公约数
- git add -p用法记录
- 创建数据库、文件组、删除数据库
- 作业四:结对编程2
- 2016年第一季度阅读书目
- Compound Interest Calculator4.0