题目描述:
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
题目类型:暴力、回溯
暴力算法代码:(严禁抄袭,请尝试自己动手实现。——Ldu1403)
#include<stdio.h>
#include<math.h>
#define n 8
int main()
{
int i,j,num,flag;
int count=0;
int a[n]={0};
for(num=0;num<pow(n,n);num++) {
int temp=num;
for(i=0;i<n;i++) {
a[i]=temp%n;
temp/=n;
}
flag=1;
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) { //将满足条件的输出
temp=num;
for(i=0;i<n;i++) {
a[i]=temp%n;
temp/=n;
printf("%d ",a[i]);
}
printf("\n");
count++;
}
}
printf("%d\n",count);
return 0;
}
回溯算法代码:(严禁抄袭,请尝试自己动手实现。——Ldu1403)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define n 8
int row=0;
int a[10]={0};
int count=0;
int peace(int i)
{
int j;
for(j=0;j<i;j++) { //判断与前面的皇后是否冲突
if(a[i]==a[j] || abs(i-j)==abs(a[i]-a[j]))
return 0;
}
return 1;
}
void traceback(int row)
{
int i,j;
if(row==n) {
for(i=0;i<n;i++)
printf("%2d",a[i]);
printf("\n");
count++;
}
for(j=0;j<n;j++) {
a[row]=j; //为第row行上的皇后选择列
if(peace(row))
traceback(row+1);
}
}
int main()
{
int i;
traceback(row);
printf("%d\n",count);
return 0;
}