浅谈八皇后问题

来源:互联网 发布:神话特效软件 编辑:程序博客网 时间:2024/05/08 07:53

八皇后问题是一个古老而著名的问题,最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出,问题概要是,在一个8*8的棋盘上,放八只皇后,令其相互不能攻击,最多有几种放法。(皇后能攻击同行,同列还有同一对角线上的棋子),简单用人脑模拟一下,就会发现其分支太多,人脑模拟不过来,接下来就是计算机登场的时候。

[八皇后问题的一个可行解

计算机怎么处理这个问题呢,当然也是用人脑一样的方法,一个一个去试,第一个皇后随便放一个位置,第二个也随便找一个位置,判断行不行,行的话就再找一个位置放第三个,不行的话第二个放另外的地方,依此类推。。。

但是,你会发现,这样实在太多种可能,第一个皇后有64种选择,第二个有63种选择,计算机有可能也承受不住,而且这样的程序也很难写(很关键)。所以我们要做一点简单的判断和处理,你会发现,每一行只能放一个皇后(为什么),放了一个皇后之后,会对其他皇后的可放位置产生影响(辅助数组)。
所以程序就跃然于纸上了(省略了好多步)。

#include<stdio.h>int n,cnt=0;int col[14]={0},dia1[28]={0},dia2[28]={0};void dfs(int k){    if (k==(n+1))     {           cnt++;        return;    }    for (int i=1;i<=n;i++)    {        if (!col[i]&&!dia1[k-i+n]&&!dia2[k+i])        {            col[i]=1; dia1[k-i+n]=1; dia2[k+i]=1;            dfs(k+1);            col[i]=0; dia1[k-i+n]=0; dia2[k+i]=0;        }    }}int main(){    scanf("%d",&n);    dfs(1);    printf("%d",cnt);     return 0;} 

col,dia1,dia2数组是用来判断是否与已放皇后冲突,用到了一些细节处理。
k是表示当前搜索到第几层。
没错,这个程序用的算法就是深度优先搜索和回溯法。

如果上述描述或程序有问题,抑或有哪里不清楚,欢迎留下您宝贵的评论。

原创粉丝点击