八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
这是原文链接 下面是我自己写的代码
https://blog.csdn.net/sxhlovehmm/article/details/46763305?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98c%E8%AF%AD%E8%A8%80&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-46763305.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
回溯法:
# include <stdio.h>
int queen[8],ans = 0;
int abs(int a,int b){
if(a>b){
return a-b;
}
else{
return b-a;
}
}
void list(){
int i;
for(i = 0;i<8;++i){
printf("%d,%d ",i,queen[i]);
}
printf("\n\n");
ans++;
}
int check(int n){
int i;
for(i = 0;i < n;++i){
if(queen[i] == queen[n] || abs(queen[i],queen[n]) == (n-i) return 0; //该注意的点
}
return 1;
}
void tain(int n){
int i;
for(i = 0;i < 8; ++i){
queen[n] = i;
if(check(n)){
if(n == 7) list();//该注意的点
else tain(n+1);
}
}
}
int main(void){
tain(0);
printf("%d",ans);
return 0;
}
问题比较简单,该注意的我问题在代码中已经标出。