算法 N皇后问题
2016-12-01 21:15
246 查看
题目
在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。暴力法:
#include <stdio.h> #include <math.h> #define n 8 int a ;//元素值为皇后所在列的位置 int temp,i,j,num; int flag; int count = 0; int main(){ for(num=0; num<pow(n,n); num++){ temp=num; flag = 1; for(i=0; i<n; i++){ a[i]=temp%n; temp=temp/n; } for(i=0; i<n; i++){ for(j=i+1; j<n; j++){ //绝对值,判断皇后是否在同行,或者斜线方向 if(a[i]==a[j] || abs(i-j)==abs(a[i]-a[j]) ){ flag=0; break; } } } if(flag==1) count++; } printf("%d\n",count); return 0; }
回溯法:
#include <stdio.h> #include<math.h> #define n 8 int a ; int count=0; //在第t列是否可放置 int ok(int t){ for(int k=0; k<t; k++){ if(a[k]==a[t] || abs(k-t)==abs(a[k]-a[t])){ return 0; } } return 1; } void dfs(int t){ if(t==n) count++; else{ for(int i=0; i<n; i++){ a[t]=i;//对于第t行,第i列,放置皇后. //判断刚才放置的位置是否可行,如果可行,就放置下一行。不可行的话,继续在第t行放置 if(ok(t)){ dfs(t+1); } } } } int main(){ dfs(0); printf("%d.\n",count); return 0; }
相关文章推荐
- 国际象棋“皇后”问题的回溯算法
- 国际象棋“皇后”问题的回溯算法
- 回溯算法 8皇后问题的一种解法 适合初学者观察整个回溯的过程
- lv 算法与回溯法相结合解决n皇后问题
- 经典算法(1)——8皇后问题求解(回溯法)
- 目前最快的N皇后问题算法!!!
- 原始版N皇后问题,最慢的算法
- 回溯算法n皇后问题
- 国际象棋“皇后”问题的回溯算法
- 算法系列——N皇后问题
- 国际象棋“皇后”问题的回溯算法
- 算法之8皇后问题(C语言)
- 国际象棋“皇后”问题的回溯算法
- N皇后问题算法
- N皇后问题求解算法
- 国际象棋“皇后”问题的回溯算法
- 国际象棋“皇后”问题的回溯算法
- 经典算法(1)——8皇后问题求解(回溯法)
- N皇后问题摆法算法描述
- QS2算法求解N-皇后问题