数据结构与算法2:八皇后问题

来源:互联网 发布:淘宝男装代理 编辑:程序博客网 时间:2024/05/16 17:26

    问题描述:八皇后问题是在一个国际象棋的棋盘上(8乘8)摆放8个皇后,使得相互无法攻击。国际象棋中,皇后的攻击范围是同一行、同一列或者同一对角线上。这个问题总共有92个解(包括对称、旋转都算)。

    问题分析:这个问题解法基本上就是尝试不同的情况,留下符合要求的,具体做法很多,这边只是我的做法。考虑到一个事实:每一行有且仅有一个皇后,否则不成立。因此,我们可以把全部的解空间看做一棵树,第i层的情况表示第i行的摆放情况,如此搜索即可。当发现某一种情况不可能时,就不要再往下搜,而是回过头去看。

    这个过程思路还是很清楚的,代码倒是边界情况比较不好想,想清楚再写。下面是C语言代码。

#include <stdio.h>int n;int list[8];int total = 0;int isSafe(int line, int pos){int i;if (line == 0)return 1;for (i = 0; i < line; i++){if (list[i] == pos || line-i == pos-list[i] || line-i == list[i]-pos){//printf("fail%d! ", pos);return 0;}}//printf("Safe%d! ", pos);return 1;}void search(int line){int i;//printf("now search %d\n", line);if (line == n){printf("get:");for (i = 0; i < n; i++)printf("%d ", list[i]);printf("\n");total++;}else{for (i = 0; i < n; i++){if (isSafe(line, i)){list[line] = i;search(line + 1);}}}}int main(){printf("n:");scanf("%d", &n);search(0);printf("total:%d\n", total);return 0;}


0 0
原创粉丝点击