您的位置:首页 > 其它

算法 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 n皇后 暴力 回溯