您的位置:首页 > 其它

八皇后问题

2011-10-26 18:59 295 查看
开始慢慢切acm题,有空就切一些吧,慢慢练算法

zoj的1002,是一个八皇后问题的变种,恰好上次卓卓也和我说过八皇后问题

索性就好好学习一下这个题的解决方案吧

自己折腾了一下,最后还是参考了网上的现成答案,罪过罪过,没怎么经脑子啊

以后要自己多动脑子,不废话,入正题。

八皇后问题,详情不解释,不知者百度之

首先是,存储八皇后地址的数据结构,还是一个一维数据结构比较好用。数组下标表示棋盘的第几行,相应下标所记录的值表示皇后在第几列。判断两个皇后是否在一列上是比较方便的了,对比其列值即可。判断是否在同一斜线上也很简单,详情见代码了。

使用的方式还是递归回溯。这个比较简单了递归到最后一行的时候,记录一下。代码比较简单,一看就能看懂。

#include <iostream>
#include <cmath>
using namespace std;

int Count;
bool isOk(int *arr, int i)
{
for(int k=1;k!=i;k++)
if(arr[i] == arr[k] || abs(i-k) == abs(arr[i] - arr[k]))
return false;
return true;
}

void Queen(int *arr, int i, int n)
{
/* 尝试着在第i行的第j列放置一个皇后。*/
for(int j=1;j!=n+1;j++)
{
arr[i] = j;//如果下面判断为false,则之后的循环会将其覆盖之
if(isOk(arr,i))
{
//到第n行,就说明判定结束了,这是一种可行方案
if(i == n)
Count++;
else
Queen(arr,i+1,n);
}
}
}

int main()
{
int N;
Count = 0;
cout<<"Please input the number of the queen:";
cin>>N;
int *arr = new int[N+1];
Queen(arr,1,N);

cout<<"总共有"<<Count<<"种排列方式";
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: