アットウィキロゴ

エイトクイーン問題【C言語】

<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