八皇后问题
2011-10-26 18:59
295 查看
开始慢慢切acm题,有空就切一些吧,慢慢练算法
zoj的1002,是一个八皇后问题的变种,恰好上次卓卓也和我说过八皇后问题
索性就好好学习一下这个题的解决方案吧
自己折腾了一下,最后还是参考了网上的现成答案,罪过罪过,没怎么经脑子啊
以后要自己多动脑子,不废话,入正题。
八皇后问题,详情不解释,不知者百度之
首先是,存储八皇后地址的数据结构,还是一个一维数据结构比较好用。数组下标表示棋盘的第几行,相应下标所记录的值表示皇后在第几列。判断两个皇后是否在一列上是比较方便的了,对比其列值即可。判断是否在同一斜线上也很简单,详情见代码了。
使用的方式还是递归回溯。这个比较简单了递归到最后一行的时候,记录一下。代码比较简单,一看就能看懂。
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; }