八皇后问题自我总结
2016-11-05 16:06
211 查看
八皇后
Description
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
Input
NoOutput
输出所有八皇后问题的解
注解:在国际象棋中,皇后可以吃掉在同一行、列、斜线的其他的棋子。
八皇后是一个经典的题目(作为一个菜鸟这是我碰到的比较难的一个题,所以自我总结一下,大佬请直接跳过)
在本题中我使用的是c语言(菜鸟只会这个,还在学习中)。
在整个代码中我用三个不同的函数(printarray,check,placeQueen)来解决问题,printarray用来输出最后的解,check用来检查当前放置的棋子是否符合题意,planeQueen(dfs)用来不停地放置棋子。
我用一个一维数组来表示一个解,用printarray来翻译这个一维数组使其变成最后的答案。
例:04752613:
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
如上图所示:每一位数字都代表一行中第n+1位有一枚棋子,第一位数字为0,第一行的0+1位就表示有一个皇后。
其中check函数中来检查当前放置的棋子是否正确,diff=abs(chess[row]-chess[i]),diff==0时代表有同一列有多个皇后,diff==row-i时代表在同一斜线上有多个皇后(因为在这个一维数组中每一位数代表一枚棋子的位置,所以不存在同一行有两个棋子)。
placeQueen函数使用了dfs算法,chess[row]=i代表落入一个棋子,然后用check函数来检查对错,一旦错误这一路径将终结,正确将开始下一次计算,只有当row==N时,当前的一维数组才是正确的,用printarray函数来输出答案。
#include<stdio.h> #include<math.h> #define N 8 int chess ; int num=1; int main(){ void printarray(int[]); int check(int); void placeQueen(int); placeQueen(0); return 1; } void printarray(int data[8]){ int i,j; printf("No.%2d:\n",num++); for(j=1;j<=N;j++){ for(i=0;i<N;i++) if(i==data[j-1])printf("1 "); else printf("0 "); printf("\n"); } } int check(int row){ int i; for(i=0;i<row;i++){ int diff=abs(chess[row]-chess[i]); if(diff==0||diff==row-i)return 0; } return 1; } void placeQueen(int row){ int i; if(row==N){ printarray(chess); return; } else for(i=0;i<N;i++){ chess[row]=i; if(check(row)) placeQueen(row+1); } }如果有需要的朋友,可以转载本文。
相关文章推荐
- Const 问题 ( 自我总结,仅供参考 )
- Tomcat中主目录配置与虚拟目录配置问题自我总结
- 八皇后问题总结
- 双向链表的问题-自我总结
- 经典进程的同步问题自我总结
- Java,InputStream,Socket阻塞.(关于HTTP请求的IO问题自我总结)
- 自我学习——ajax——跨域问题总结
- 初级--git及GtiHub初次使用遇到问题自我总结
- Android锁屏问题自我总结(海纳百川,博采众长)
- Java工作小问题自我总结
- 自我总结初级程序员易错问题1—命令空间使用
- 关于BGP同步问题的自我总结
- Tomcat中主目录配置与虚拟目录配置问题自我总结
- LR自我总结的问题
- 关于Arduino问题查找的自我总结
- 数据库插入的小问题(自我总结)
- 关于高精度问题的自我总结
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
- 过滤驱动的问题-自我总结
- 线上问题解决的自我总结