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で配置判定
全駒配置できた回数を出力
終了

いいなと思ったら応援しよう!