<stdio.h>
<stdlib.h>
int num[8]; /* i行目はnum[i]列に置く */
int frag[8]; /* i行目のnum[i]列を使ったか */
int count=0;
void print_field(void){ /* 盤上表示 */
int i,j;
for(i=0; i<8; i++){
printf("|");
for(j=1; j<=8; j++){
if(num[i]==j){
printf("Q|");
}
else{
printf(" |");
}
}
printf("\n");
}
printf("\n");
count++;
}
void queen(int n, int k, int x, int y){ /* 順列生成 */
int i,f,j;
for(i=0;i<n;++i){
f=frag[i];
if(f == 0){
for(j=0; j<n-k; j++){ /* 斜めの判定 */
if(abs((i+1)-num[j])==abs(n-k-j)){
j=-1;
break;
}
}
if(j!=-1){
frag[i]=1;
num[n-k] = i+1;
if(k==1){
if(x==0 || y==0 || num[y-1]==x)
print_field();
}
else{
queen(n,k-1,x,y);
}
frag[i] = 0;
}
}
}
}
int main(int argc, char*argv[]){
int i;
int x,y;
for(i=0;i<8;++i){
num[i] = frag[i] = 0;
}
x=0;y=0;
if(argc==3){
x=atoi(argv[1]);
y=atoi(argv[2]);
if(x<0 || 8<x || y<0 || 8<y){
printf("error:x and y 1~8\n");
return 1;
}
}
queen(8,8,x,y);
printf("ans=%d\n", count);
return 0;
}
最終更新:2014年01月10日 18:39