N王妃問題の組み合わせを数え上げるプログラムを作りました。 試作品1号冒頭の「#define N 12」で1辺の長さを指定しています。 #include <stdio.h> #define N 12 int main(){ signed int v0[N],v1[N]={0},v2,v3,v4,v5[N],v6=0; while(1){ for(v2=0;v2<N;v2++){ v0[v2]=v2; } for(v2=0;v2<N;v2++){ for(v3=v4=0;;){ if(v0[v4]!=N){ if(v3==v1[v2]){ break; } v3++; } v4++; } v5[v2]=v0[v4]; v0[v4]=N; } for(v2=0;v2<N;v2++){ for(v3=0;v3<v2;v3++){ if(v5[v2]+v2==v5[v3]+v3||v5[v2]-v2==v5[v3]-v3){ goto l0; } } } l0: if(v2==N){ v6++; v1[N-1]++; for(v2=1;v2<=N;v2++){ if(v1[N-v2]==v2){ v1[N-v2]=0; if(v2==N){ goto l1; }else{ v1[N-v2-1]++; } } } }else{ v1[v2]++; for(v2++;v2<N;v2++){ v1[v2]=0; } for(v2=1;v2<=N;v2++){ if(v1[N-v2]==v2){ v1[N-v2]=0; if(v2==N){ goto l1; }else{ v1[N-v2-1]++; } } } } } l1: printf("%d",v6); return 0; }
|