八皇后 Checker Challenge
典型的八皇后问题,用回溯遍历每一种情况,当前格子能放皇后就放,直到剩余皇后数量为0输出情况。而判断是否能放就是判断当前位置的横,竖,左斜,右斜是否有皇后,横竖都好判断,而左斜的位置index的和相等,右斜的位置index差相等。
`#include<stdio.h>
include<string.h>
void dig(int n,int j,int *psum,int *pcnt,int *pleftdown,int *r1,int r2,int line,int row,int zhan){
if(pcnt==n){
psum[0]++;
if(psum<=3){
for(int i=0;i<n;i++) printf("%d ",zhan[i]);
printf("\n");
}
return;
}
for(int i=0;i<n;i++){
if(pleftdown[i+j]0&&line[i]0&&row[j]0){
if(i>=j){
if(r1[i-j]0){
pleftdown[i+j]+=1;
line[i]++;row[j]++;
r1[i-j]++;pcnt[0]++;
zhan[pcnt-1]=i+1;
dig(n,j+1,psum,pcnt,pleftdown,r1,r2,line,row,zhan);
pleftdown[i+j]--;
line[i]--;row[j]--;
r1[i-j]--;pcnt[0]--;
}
}
else{
if(r2[j-i]==0){
pleftdown[i+j]++;
line[i]++;row[j]++;
r2[j-i]++;pcnt[0]++;
zhan[pcnt-1]=i+1;
dig(n,j+1,psum,pcnt,pleftdown,r1,r2,line,row,zhan);
pleftdown[i+j]--;
line[i]--;row[j]--;
r2[j-i]--;pcnt[0]--;
}
}
}
}
}
int main(){
int n,psum,pcnt,sum=0,cnt=0,j=0;
int line[15]={0},row[15]={0},zhan[15];
int leftdown[30]={0},right1[15]={0},right2[15]={0};
psum=∑pcnt=&cnt;
scanf("%d",&n);
dig(n,j,psum,pcnt,leftdown,right1,right2,line,row,zhan);
printf("%d",*psum);
return 0;
} `