3.八皇后问题解决
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define Max 100
int Queen[Max] = {
-1} ;
int chess[Max][Max]={
0};
int n = 8;
int number = 0;
bool Compare ( int k) //判断该皇后是否满足条件
{
int i = 0;
for (i=0; i<k; i++)
{
if (Queen[i]==Queen[k] || abs(i-k)==abs(Queen[i]-Queen[k]))
return false ;
}
return true ;
}
void Print(int N)
{
int i,j ;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
{
if (j==Queen[i]) printf("1 ") ;
else printf("0 ") ;
}
printf("\n") ;
}
printf("\n");
}
int Solve (int N)
{
int num = 0 ;
int k = 0 ;
while (k>=0)
{
Queen[k]++;
while ((Queen[k]<N) && (!Compare(k)))
{
Queen[k]++ ;
}
if (Queen[k]<N && k==N-1)
{
printf("第%d个解为:\n",++num) ;
Print (N) ;
}
else if (Queen[k]<N && k<N-1) {
k++;
}
else {
Queen[k--] = -1 ;
}
}
return num ;
}
bool Success(int k, int w){
for(int i=0;i<k;i++){
//检查判断的始终都是前面的放置好位置的皇后
for(int j=0;j<n;j++){
if(chess[i][j]==1){
if(k==i or j==w or abs(i-k)==abs(j-w))
return false;
}
}
}
return true;
}
void Printf(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",chess[i][j]) ;
}
printf("\n");
}
printf("\n");
}
void Queue(int row){
if(row==n){
printf("第%d个解为:\n",++number) ;
Printf();
}else{
for(int j=0;j<n;j++){
//模拟列
chess[row][j] = 1;
if(Success(row, j)){
//如果成功,进行下一行的探测放置
Queue(row+1);
}
chess[row][j]=0;
}
}
}
int main()
{
int N ;
scanf("%d",&N) ;
Solve(N) ;
Queue(0);
return 0;
}
解决思路完全参考:思路