八皇后问题 回溯
2015-04-10 16:33
169 查看
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
*该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,
*使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,
思路:需要一个长度为8的一维数组。数组下标表示行,数组值表示列。那么如何检查是否在同一斜线呢。只要斜率为1或者-1.即数组值相减和数组下标相减的值相等,或者为相反数。对每产生一个新的皇后,都要检查是否与前面的皇后冲突。所以理解了还是很简单的。
人家的方法
*该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,
*使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,
思路:需要一个长度为8的一维数组。数组下标表示行,数组值表示列。那么如何检查是否在同一斜线呢。只要斜率为1或者-1.即数组值相减和数组下标相减的值相等,或者为相反数。对每产生一个新的皇后,都要检查是否与前面的皇后冲突。所以理解了还是很简单的。
//自己根据之前的用标记,来写的!对了! //看来这题和全排列其实差不多。 #include<cstdio> int a[8],count; int v[8]={0}; void print(){ for(int i=0;i<8;i++){ printf("%d%c",a[i],i==7?'\n':' '); } } bool check(int i){ for(int j=0;j<i;j++){ if(v[a[i]]||a[i]-a[j]==i-j||a[j]-a[i]==i-j) return false; } return true; } void fun(int n){//在循环中使用递归,此刻考察的是第n个皇后! if(n==8){ print(); count++; return; } for(int i=0;i<8;i++){//想一想全排列。并且排除已经排在队列中的 a =i; if(check(n)){//与全排列的差别只是这里的check函数复杂一些 v[i]=1; fun(n+1); v[i]=0; } } } int main(){ //for(int i=0) fun(0); printf("%d",count); return 0; }
人家的方法
//打印了中间结果,最后答案92,ac #include<cstdio> int a[8],count; int v[8]; void print(){ for(int i=0;i<8;i++){ printf("%d%c",a[i],i==7?'\n':' '); } } bool check(int i){ for(int j=0;j<i;j++){ if(a[i]==a[j]||a[i]-a[j]==i-j||a[j]-a[i]==i-j) return false; } return true; } void fun(int n){//在循环中使用递归,此刻考察的是第n个皇后! if(n==8){ print(); count++; return; } for(int i=0;i<8;i++){ a =i; if(check(n)){//如果循环到的这个位置符合,那么就考察下一个皇后的位置啊! fun(n+1); } } } int main(){ //for(int i=0) fun(0); printf("%d",count); return 0; }
相关文章推荐
- 八皇后问题 回溯递归 C语言版
- 回溯法解八皇后问题
- 八皇后问题 --回溯
- 利用回溯的八皇后问题
- Queen 八皇后问题 回溯经典解法
- GDI+学习(7) 八皇后问题回溯算法演示系统
- 八皇后问题 DFS,回溯剪枝 //http://poj.grids.cn/practice/2698
- 八皇后问题(递归、非递归——回溯)
- C# 用回溯递归解决“八皇后”问题
- 八皇后问题、N皇后问题回溯法详解
- 【算法复习二】八皇后问题 ---- 回溯
- 【算法复习二】八皇后问题 ---- 回溯
- 回溯法解决八皇后和0,1背包问题和排列问题
- 回溯法-八皇后问题之C实现
- 八皇后问题回溯算法演示系统
- 八皇后问题 C#版本算法 回溯法
- 回溯算法---八皇后问题
- uva 11553 Grid Game (回溯- 类似,比八皇后问题简单)
- 回溯算法之八皇后问题
- C#WPF实现回溯算法解决八皇后问题