用递归枚举实现八皇后问题
2016-03-12 22:52
316 查看
<pre name="code" class="cpp">#include <iostream> using namespace std ; int total = 0 ; //判断row行line列是否可以放皇后 bool isCan(int row , int line , int chess[8][8]) { int i , j ; //判断同列中是否有皇后 for( i = 0 ; i < 8 ; i++) { if(chess[i][line] == 1) { return false ; } } //判断左上是否有皇后 for( i = row , j = line ; i >= 0 && j >= 0 ; i-- , j--) { if(chess[i][j] == 1) { return false ; } } //判断右上是否有皇后 for( i = row , j = line ; i >= 0 && j < 8 ; i-- , j++) { if(chess[i][j] == 1) { return false ; } } //判断左下是否有皇后 for( i = row , j = line ; i < 8 && j >= 0 ; i++ , j--) { if(chess[i][j] == 1) { return false ; } } //判断右下是否有皇后 for( i = row , j = line ; i < 8 && j < 8 ; i++ , j++) { if(chess[i][j] == 1) { return false ; } } return true ; } //row表示从0行开始递归到最后一行 //line是8列 void Eightqueen( int row , int line , int chess[8][8]) { int chessCopy[8][8] , i , j ; //复制出一个新的棋盘 for( i= 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { chessCopy[i][j] = chess[i][j] ; } } if( row == 8) //如果每行都放了一个皇后 { total++ ; cout << "第" << total << "中方案:" << endl ; for( i = 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { cout << chess[i][j] << " " ; } cout << endl ; } cout << endl ; } else { for(i = 0 ; i < 8 ; i++) //从每行的第一个各自开始放 { if(isCan( row , i , chessCopy))//如果该格可以放 { for(j=0 ; j < i ; j++) //清除以前放过的皇后 { chessCopy[row][j] = 0 ; } chessCopy[row][i] = 1 ; Eightqueen(row+1 , line , chessCopy) ;// 去下一行里寻找 } } } } int main() { int chess[8][8] , i , j ; for( i = 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { chess[i][j] = 0 ; } } Eightqueen( 0 , 8 , chess) ; return 0; }
相关文章推荐
- 蓝桥杯 打印十字图
- 支持向量机理论及工具LibSVM
- Java NIO: Non-blocking Server
- 前端学习总结(十一)Cordova(Phonegap)常用命令与基础
- Java基础练习
- 细说HTML<head>内标签之<meta>
- jquery插件-表单验证插件-提示信息中文化与定制提示信息
- hdu-5641 King's Phone (水题)
- mysql数据类型
- Hadoop伪分布式搭建过程详解
- BestCoder Round #75 King's Cake 模拟&&优化 || gcd
- 客户端检测技术
- 软件过程与项目管理(第三次作业)
- 用UIScrollView,UIPageControl来实现滚动视图。
- Java UDP 编程
- 单臂路由,捆绑链路
- Hadoop 学习相关资料
- Hadoop 学习相关资料
- Hadoop 学习相关资料
- Hadoop 学习相关资料