#include
#include
enum Status {TRUE,FALSE}; //枚举状态
int matrix[8][8]; //2位矩阵
int a[8],b[15],c[15]; //按行设置标志位
int count; //统计个数
//初始化函数
void init()
{
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
matrix[i][j]=0; //矩阵置0
a[i]=-1; //标志位置-1
}
for(i=0;i<15;i++)
b[i]=c[i]=0; //标志位置0
count=0; //统计个数置0
}
//矩阵输出
void show(){
printf("\n");
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
printf("%d ",matrix[i][j]);
printf("\n");
}
}
//判断是否可以放置,TRUE可以;FALSE不可以
Status isAvailable(int row,int column){
if(a[column]!=-1||b[row+column]==1||c[7-(column-row)]==1)//当前列被放置,或者该列所在的行和所在列存在放置,不可以放置
return FALSE;
for(int i=0;i<8;i++)
if(a[i]==row) //当前列为行号,不可以放置
return FALSE;
return TRUE;
}
//重置矩阵所在行和列,进行局部清零
void reset(int row,int column){
matrix[row][column]=b[row+column]=c[7-(column-row)]=0;
a[column]=-1;
}
//如果可以放置,置所在的坐标位置为1
void set(int row,int column){
matrix[row][column]=b[row+column]=c[7-(column-row)]=1;
a[column]=row;
}
//对当前行的各个列进行递归调用,寻找放置位置
void recurse(int row,int column){
int nextcolumn=column+1;
for(int i=0;i<8;i++){
if(isAvailable(i,nextcolumn)==TRUE){//如果能放置
set(i,nextcolumn); //置1代表放置成功
if(nextcolumn==7){
show();
count++;
}
recurse(i,nextcolumn);
reset(i,nextcolumn);
}
}
}
int main(){
init();
for(int i=0;i<8;i++){
if(isAvailable(i,0)==TRUE){
set(i,0);
recurse(i,0);
reset(i,0);
}
}
printf("\n一共有%d个解\n",count);
return 0;
}