由于最近课程需要提交“八皇后”代码,特此写下此博客,来做一下关于八皇后的总结。
八皇后问题
八皇后问题,即在一个 8x8 的棋盘上,放置 8 个皇后棋子,其中每个皇后都不能处于同一条横行、纵行上,也不能处于同一条斜线上。
参考视频
在编程过程中,我感觉有些视频讲的很好,这里分享出来:
参考视频:懒猫老师-C 语言-递归函数-八皇后问题(搜索,回溯)
实现代码
这里的代码用的语言是 ToyPL,是吴老师自己手写的玩具语言,里面没有 for,所以用 while 来代替了。(语法简单,不用特意解释就能看懂)
特别说明:由于语言特性,在全局只能声明数组变量,所以下方的 count 为数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| // 第row行皇后所占位置的列号 int queen[8] // 标志数组,表示第col列是否可用,默认为true(可用) bool flag[8] // 表示上对角线是否可用 bool d1[15] // 表示下对角线是否可用 bool d2[15] // 解法个数(八皇后有92个解) int count[2] fun main() { init() generate(0) print("共有"+count[1]+"种解法\n") } fun init() { // 初始化数组 int i=0 while(i<8) { queen[i]=-1 flag[i]=true i=i+1 } i=0 while(i<15) { d1[i]=true d2[i]=true i=i+1 } count[1] = 0 print("初始化成功...\n") } fun generate(int n) { int col = 0 // 每个皇后都有8列 while(col<8) { // 判断位置是否可用 if(flag[col]&d1[n-col+7]&d2[n+col]) { // 在n行col列摆放皇后 queen[n]=col // 设置第col列不可用 flag[col]=false // 设置两个对角线不可用 d1[n-col+7]=false d2[n+col]=false // 8个皇后没有摆完,递归摆放下一行里面的皇后 if(n<7) { generate(n+1) }else { // 皇后都放完了,打印结果 printQ() } //回溯,考虑其他的可行方案 flag[col]=true d1[n-col+7]=true d2[n+col]=true } col=col+1 } } fun printQ() { count[1]=count[1]+1 print("第"+count[1]+"个解法:") int i=0 while(i<8) { print(queen[i] + " ") i=i+1 } print("\n") }
|
__END__