八皇后布局问题 -- 回溯法
来源:互联网 发布:网页美工设计实训 编辑:程序博客网 时间:2024/05/18 14:11
回溯法解决n皇后布局问题
将n个皇后的布局使用一维数组表示,数组的下标为列(COL)数组的元素的值为对应的行(ROW)
主要注意三个地方:
1)判断条件(不同行,不同列,不同对角线)
2)停止条件(回退到第一列最后一个位置)
3)回退标志,每次进行回退操作时,要将回退标志置位。(这个标志位的理解很重要)
代码可以直接运行,产生92个打印的结果。
#include <stdio.h>#define ROW (8 - 1)#define COL (8 - 1)#define true 1#define false 0bool isSameLine(int x1,int y1,int x2,int y2){if(x1 == x2)return true;if(y1 == y2)return true;return false;}int abs(int value){if(value < 0)return -value;else return value;}bool isSameCross(int x1,int y1,int x2,int y2){if(abs(x2 - x1) == abs(y2 - y1))return true;return false;}char isFit(char array[],int num){for(int i = 0; i <= num; i++){for(int j = i+1; j <= num; j++){if(isSameLine(i,array[i],j,array[j])){return false;}if(isSameCross(i,array[i],j,array[j])){return false;}}}return true;}void print_result(char *ar){static int count = 1;printf("%d)--------------------\n",count++);for(int i =0; i <= COL;i++){for(int j =0; j <= ROW;j++){if(ar[j] == i) printf("* ");else printf("- ");}printf("\n");}printf("-----------------------\n");//getchar();}void work( ){char ay[8] = {0};int curCol = 0;bool isBack = 0;while(true){if(isBack){if(curCol == 0 && ay[curCol] == ROW){//结束条件 break;}if(ay[curCol] == ROW){ay[curCol] = 0;curCol--;continue;}else ay[curCol]++;isBack = false;}if(isFit(ay,curCol)){ //如果满足条件if(curCol == COL){ //最后一列都满足,直接可以输出print_result(ay); //最后一列还没结束,继续if(ay[curCol] < ROW){ay[curCol]++;continue;}else{ay[curCol]=0;curCol--;//回退,注意设置标志isBack = true;;}}else {curCol++;continue;}}//if(ay[curCol] < ROW){ay[curCol]++;}else{if(curCol == COL){ay[curCol]=0;curCol--;isBack = true;;}else curCol++;}}}int main(int argc, _TCHAR* argv[]){work();getchar();return 0;}
//关于递归加回溯法解决此问题的例子,请看http://blog.csdn.net/sandyzhs/article/details/3390022 。这里写的真不错。高手!
0 0
- 八皇后布局问题 -- 回溯法
- 八皇后问题 回溯法
- 八皇后问题 回溯法
- 八皇后问题 回溯法
- 八皇后问题-回溯法
- 八皇后问题 回溯法
- 八皇后问题 回溯法
- 八皇后问题-回溯法
- 八皇后问题 回溯法
- 回溯法八皇后问题
- 八皇后问题--回溯法
- 八皇后问题 回溯法
- 回溯法:八皇后问题
- 八皇后问题-回溯法
- 回溯法-八皇后问题
- 回溯法---八皇后问题
- 八皇后问题回溯法
- 八皇后问题(回溯法)
- 第二学期第13周项目2--圆的比较
- csu 1458: Booking (开的房间数量)
- Win8 + VS2013 + SQL Server 2014 下载地址
- 个地方和风格化发给街净哥和价格
- 刚学 RMQ 求大神指点
- 八皇后布局问题 -- 回溯法
- flash 中的部分概念
- codeforces 4A Watermelon(数学水题)
- 黑马程序员——三大特性
- 第十三周自由练习项目——acm
- OCP-1Z0-051 补充题库 第5题 主查询和子查询的注意事项
- 虚函数
- Mybatis动态sql详解
- 平滑曲线连接各点(贝塞尔曲线)