1-八皇后暴力枚举算法
#include <stdio.h>
#include<math.h>
int check1(int a[],int n){
int i,j;
for(i=2;i<=n;i++)
for(j=1;j<=i-1;j++)
if((a[i]==a[j]) or(abs(a[i]-a[j])==abs(i-j)))
return(0);
return(1);
}
void queen1(){
int a[9],i,count=1;
for(a[1]=1;a[1]<=8;a[1]++)
for(a[2]=1;a[2]<=8;a[2]++)
for(a[3]=1;a[3]<=8;a[3]++)
for(a[4]=1;a[4]<=8;a[4]++)
for(a[5]=1;a[5]<=8;a[5]++)
for(a[6]=1;a[6]<=8;a[6]++)
for(a[7]=1;a[7]<=8;a[7]++)
for(a[8]=1;a[8]<=8;a[8]++){
if(check1(a,8)==0);
else {
printf("[%d]\t",count++);
for (i=1;i<=8;i++)
printf("%d\t",a[i]);
printf("\n");
}
}
}
int main(){
queen1();
return 0;
}
2-八皇后回溯枚举算法
#include <stdio.h>
#include<math.h>
int check(int a[],int n){//多次被调用,只是一重循环
int i;
for(i=1;i<=n-1;i++)
if ((abs(a[i]-a[n])==abs(i-n)) or (a[i]==a[n])) return(0);
return(1);
}
void queen2(){
int a[9],i,count;
for(a[1]=1;a[1]<=8;a[1]++)
for(a[2]=1;a[2]<=8;a[2]++){
if(check(a,2)==0) continue;
for(a[3]=1;a[3]<=8;a[3]++){
if(check(a,3)==0) continue;
for(a[4]=1;a[4]<=8;a[4]++){
if(check(a,4)==0) continue;
for(a[5]=1;a[5]<=8;a[5]++){
if(check(a,5)==0) continue;
for(a[6]=1;a[6]<=8;a[6]++){
if(check(a,6)==0) continue;
for(a[7]=1;a[7]<=8;a[7]++){
if (check(a,7)==0) continue;
for(a[8]=1;a[8]<=8;a[8]++){
if (check(a,8)==0)continue;
else {
printf("[%d]\t",count++);
for (i=1;i<=8;i++)
printf("%d\t",a[i]);
printf("\n");
}
}
}
}
}
}
}
}
}
int main(){
queen2();
return 0;
}
3-八皇后递归回溯算法
#include <stdio.h>
#include<math.h>
int a[100],n=8,count=1;
int check(int a[],int n){//多次被调用,只是一重循环
int i;
for(i=1;i<=n-1;i++)
if ((abs(a[i]-a[n])==abs(i-n)) or (a[i]==a[n])) return(0);
return(1);
}
backtrack(int k){
int i;
if (k>n) {
printf("[%d]\t",count++);
for (i=1;i<=8;i++)
printf("%d\t",a[i]);
printf("\n");
}//找到一个解输出结果;
else
for (int i = 1;i <=n; i++)
{
a[k] = i;
if (check(a,k) == 1) backtrack(k+1);
}
}
int main(){
backtrack(1);
return 0;
}
4-八皇后非递归回溯算法
#include <stdio.h>
#include<math.h>
int a[100],n=8,count=1;
int check(int a[],int n){//多次被调用,只是一重循环
int i;
for(i=1;i<=n-1;i++)
if ((abs(a[i]-a[n])==abs(i-n)) or (a[i]==a[n])) return(0);
return(1);
}
void backdate (int n){
int k=1,i;
a[1]=0;
while( k>0 ){
a[k]=a[k]+1;
while ((a[k]<=n) && (check(a,k)==0)) //搜索第k个皇后位置
a[k]=a[k]+1;
if(a[k]<=n)
if(k==n ) {
printf("[%d]\t",count++);
for (i=1;i<=8;i++)
printf("%d\t",a[i]);
printf("\n");
} //找到一组解,输出
else {
k=k+1; //继续为第k+1个皇后找到位置
a[k]=0; //注意下一个皇后一定要从头开始搜索
}
else k=k-1; //回溯
}
}
int main(){
backdate(8);
return 0;
}