//8行8列的棋盘上放入8个皇后,使其任意两个皇后不能处于同一行、同一列或同一斜线(对角线)上,有几种摆法
#include<stdio.h>
#include<math.h>
#define N 8
int sum = 0;
//法一:使用全排列
/*int check(int queen[])
{
int i, j;
for(i=0; i<N-1; i++)
for(j=i+1; j<N; j++)
if(queen[i]-queen[j]==i-j || queen[i]-queen[j]==j-i) return 0;
return 1;
}
//获得皇后问题的全排列
void q(int queen[], int k)
{
int i;
if(k>=N)
{
if(check(queen)) sum++;
}
for(i=k; i<N; i++)
{
int t = queen[k]; queen[k] = queen[i]; queen[i] = t; //试探
q(queen,k+1);
t = queen[k]; queen[k] = queen[i]; queen[i] = t; //回溯
}
}
int main()
{
int i, queen[8]; //0~N-1中各皇后所在列
for(i=0; i<N; i++)
queen[i] = i; //因此全排列后不会存在有任意两个皇后位于同一列
q(queen,0);
printf("%d\n", sum);
return 0;
} */
//法二:分别从每一行试探
int queen[8]; //0~N-1中各皇后所在列
int check(int k)
{
int j;
for(j=0; j<k; j++)
{
if(queen[j]==queen[k] || fabs(queen[j]-queen[k])==k-j) return 0; //queen[j]-queen[k]==j-k || queen[j]-queen[k]==k-j
}
return 1;
}
void put(int k)
{
int i;
if(k>=N)
{
sum++;
return;
}
for(i=0; i<N; i++) //在0~N-1列尝试
{
queen[k] = i;
if(check(k)) put(k+1);
}
}
int main()
{
put(0); //从第0行开始尝试
printf("%d\n", sum);
return 0;
}
//法三:分别从每一列试探
/*int queen[8]; //0~N-1列中各皇后所在行
int check(int k)
{
int j;
for(j=0; j<k; j++) //0~k列
{
if(queen[j]==queen[k] || fabs(queen[j]-queen[k])==k-j) return 0; //当前行已放有皇后或已有皇后放入该位置的对角线上,该尝试不可行
}
return 1;
}
void put(int k)
{
int i;
for(i=0; i<N; i++)
{
queen[k] = i; //把第k列的皇后放在第i行
if(check(k))
{
if(k>=N-1) sum++; //已全部摆好
else put(k+1); //继续放下一个皇后
}
}
}
int main()
{
put(0); //从第0列开始尝试
printf("%d\n", sum);
return 0;
}*/
05-24