注意: 1、回溯法
2、逐行判断
3、打印调试
算法:将不能填入的棋盘格进行计数累加,回溯时则将计数累减。当所有皇后都放入棋盘则累加计数值并返回。
代码:
#include "OJ.h"
/*
功能: 求解放置8皇后方案的个数。
输入:
无
返回:
int:放置8皇后方案的个数
*/
void PrintQueen(int *chess,int n){
int k,size=n*n;
printf("\n");
for(k=0;k<size;k++){
printf("%d ",chess[k]);
if(k>0 && (n-1)==k%n)
printf("\n");
}
}
void RecordChess(int *chess,int x,int y,int n,int m){
int i,j;
for(i=x,j=0;j<n;j++)
chess[j+i*n] += m;
for(i=0,j=y;i<n;i++)
chess[j+i*n] += m;
for(i=x-1,j=y-1;i>=0 && j>=0;i--,j--)
chess[j+i*n] += m;
for(i=x+1,j=y+1;i<n && j<n;i++,j++)
chess[j+i*n] += m;
for(i=x-1,j=y+1;i>=0 && j<n;i--,j++)
chess[j+i*n] += m;
for(i=x+1,j=y-1;i<n && j>=0;i++,j--)
chess[j+i*n] += m;
chess[y+x*n] -= m;
}
int PlaceQueen(int *chess,int qn,int *count,int n){
int i,j,k;
if(n == qn){
(*count)++;
//PrintQueen(chess,n);
return 0;
}
for(k=0;k<n;k++){
i = qn;
j = k;
if(0 != chess[j+i*n])
continue;
else{
RecordChess(chess,i,j,n,1);
//PrintQueen(chess,n);
PlaceQueen(chess,qn+1,count,n);
RecordChess(chess,i,j,n,-1);
//PrintQueen(chess,n);
}
}
return 0;
}
int PlaceQueenMethodNum(int n)
{
/*在这里实现功能*/
int *chess = NULL;
int m = 0;
if(n<=0)
return -1;
chess = (int *)malloc(n*n*sizeof(int));
if(!chess)
return -1;
memset(chess,0,n*n*sizeof(int));
PlaceQueen(chess,0,&m,n);
return m;
}