想把代碼貼這裏,有時間在慢慢討論
/*
* Copyright (c) leo
* All rights reserved.
* filename: nQueens
* summary :
* version : 1.0
* author :
* date : 8.12.2011
*問題:
* 在n*n (n=1 or n>=4 )的棋盤上放置n個皇后,如果在同一行,同一列,同一對角線上都不存在兩個皇后,
* 那麼這個棋盤格局就是n皇后的一個解。
*要求:
* 找出n皇后的一組解即可,打印出放置滿足n皇后條件的棋子位置
*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define N 8 //皇后數=棋盤行列數
int a[N]; //a[i]爲第i行皇后所在列
void show() //圖形化輸出
{
int i;
int p,q ;
int b[N][N]={0};
static t=1;
printf("第%d個解爲: ",t++);
for(i=0;i<N;i++)
{
b[i][a[i]]=1;
printf("(%d,%d) ",i,a[i]);
}
printf("\n");
for(p=0;p<N;p++)
{
for(q=0;q<N;q++)
{
if(b[p][q]==1)
printf("●");
else
printf("○");
}
printf("\n");
}
}
int check(int n) //滿足條件返回1,否則返回0
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==a[n]||fabs(n-i)==fabs(a[i]-a[n])) //at the same column or diagonal (對角線)
return 0;
}
return 1;
}
void put(int n) //在第n行放置第n個皇后
{
int i;
if(n==N)
return ;
for(i=0;i<N;i++)
{
a[n]=i;
if(check(n)) //位置合法
{
if(n==N-1) //皇后全部放置完畢
show();
else
put(n+1);
}
}
}
int main ()
{
put(0);
return 0;
}