N竜の配置
#include <stdio.h>
#include <stdlib.h>
//------------------------------------------------
#define N 12 //盤面
int brd[N][N]; //12*12
int flg[N]; //配置済み
int ct; //全駒配置できた回数
int n; //x:列、n:個数
//------------------------------------------------
void solve(int x){
int y; //y:行
if(x == n+1){ //xがnになったら
ct++; //カウント
return; //ループを抜ける
}
for(y=0; y<n; y++){ //行がnになるまで
if(!flg[y] && !brd[x-1][y-1] && !brd[x-1][y+1]){ //配置済みでないなら
flg[y]= 1; //配置済み判定
brd[x][y]= 1; //配置
solve(x + 1); //次の列へ
brd[x][y] = 0; //未配置
flg[y] = 0; //未配置判定
}
}
}
//------------------------------------------------
int main(int argc, char *argv[]){
int i, j; //ループカウンタ
n= atoi(argv[1]); //コマンドラインより数値取得
for(i=0; i<n; i++){ //配置判定と盤面の初期化
flg[i]= 0;
for(j=0; j<n; j++){
brd[i][j]= 0;
}
}
ct= 0; //カウンタ初期化
solve(1); //solve関数で配置判定
/*
//確認用
for(i=0; i<n; i++){
for(j=0; j<n; j++){
printf("%2d", brd[i][j]);
}
printf("\n");
}
//*/
printf("%d\n",ct); //結果出力
return 0;
}
N*Nの盤面にN個の駒を配置したい
1つの駒は行列にひとつしか置けない !flg[y] &&
行に対して判定し、配置済みであればそれ以下の処理をスキップして
同じ行に配置される組み合わせを省く
駒の上下斜め1つ分は置けない !brd[x-1][y-1] && !brd[x-1][y+1]
1 0 0 0 0 0 0 0 ←行y
0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
↑
列x
行に対して配置済み判定 flg[y]= 1;
駒を配置する brd[x][y]= 1;
次の列を判定するsolve(x + 1);
未配置に設定 brd[x][y] = 0;
未配置判定に設定 flg[y] = 0;
全列配置し終わったら(x==n+1)
カウンタをひとつふやす
処理の終了
----------------------------------------------------------
main
----------------------------------------------------------
ループカウンタ宣言
コマンドラインより数値を取得してnに記録
n個分の配列を初期化する
カウンタを初期化して
関数solveで配置判定
全駒配置できた回数を出力
終了