2次元配列の受け渡し(再帰呼び出し)

import java.io.*;

public class Test {
	public static void main (String[] args)
	{
		Tile tl = new Tile();
	}
}

/********************/
/* クラスTileの定義 */
/********************/
class Tile {
	int row = 3, col = 6, n13 = 2, n12 = 6;

	/******************/
	/* コンストラクタ */
	/******************/
	Tile ()
	{
		int i1, i2, i3, i4, i5, i6, k, k3, k2, s, a[][] = new int [row][col];
		long n;

		for (i1 = 0; i1 <= n13; i1++) {
			if (i1 == 0) {
				k  = 1;
				k3 = 0;
				k2 = 1;
				s  = 1;
			}
			else {
				k  = 0;
				k3 = 1;
				k2 = 0;
				s  = 0;
			}
			for (i2 = k; i2 <= n12; i2++) {
				for (i3 = 0; i3 < row; i3++) {
					for (i4 = 0; i4 < col; i4++)
						a[i3][i4] = 0;
				}
				n = 0;
				for (i5 = 0; i5 < row; i5++) {
					for (i6 = 0; i6 < col; i6++) {
						n = set(i1, i2, k3, k2, s, 0, i5, i6, n, a);
						n = set(i1, i2, k3, k2, s, 1, i5, i6, n, a);
					}
				}
				System.out.println(n + " (" + i1 + " " + i2 + ")");
			}
		}
	}

	/*******************************/
	/* タイルの設定                */
	/*      n3 : 1 x 3 の枚数      */
	/*      n2 : 1 x 2 の枚数      */
	/*      k3 : 1 x 3 の設定数    */
	/*      k2 : 1 x 2 の設定数    */
	/*      s : =0 : 1 x 3 の設定  */
	/*          =1 : 1 x 2 の設定  */
	/*      vh : =0 : 縦           */
	/*           =1 : 横           */
	/*      y,x : 設定位置(行と列) */
	/*      m : 現時点の場合の数   */
	/*      a : 設定状況           */
	/*******************************/
	long set(int n3, int n2, int k3, int k2, int s, int vh, int y, int x, long m, int a[][])
	{
		int i1, i2, k, kk, sw = 0, b[][] = new int [row][col];
		long n = m;
						// 初期設定
		for (i1 = 0; i1 < row; i1++) {
			for (i2 = 0; i2 < col; i2++)
				b[i1][i2] = a[i1][i2];
		}
						// タイルの設定
								// 1 x 3 の設定
		if (s == 0) {
			if (vh == 0) {   // 縦
				if (y < row-2) {
					if (b[y][x] == 0 && b[y+1][x] == 0 && b[y+2][x] == 0) {
						b[y][x]   = 1;
						b[y+1][x] = 1;
						b[y+2][x] = 1;
						sw        = 1;
					}
				}
			}
			else {   // 横
				if (x < col-2) {
					if (b[y][x] == 0 && b[y][x+1] == 0 && b[y][x+2] == 0) {
						b[y][x]   = 1;
						b[y][x+1] = 1;
						b[y][x+2] = 1;
						sw        = 1;
					}
				}
			}
		}
								// 1 x 2 の設定
		else {
			if (vh == 0) {   // 縦
				if (y < row-1) {
					if (b[y][x] == 0 && b[y+1][x] == 0) {
						b[y][x]   = 1;
						b[y+1][x] = 1;
						sw        = 1;
					}
				}
			}
			else {   // 横
				if (x < col-1) {
					if (b[y][x] == 0 && b[y][x+1] == 0) {
						b[y][x]   = 1;
						b[y][x+1] = 1;
						sw        = 1;
					}
				}
			}
		}
						// 設定できた場合
		if (sw > 0) {
								// すべてのタイル設定終了
			if (k3 == n3 && k2 == n2)
				n++;
								// 次のタイル
			else {
				k  = col * y + x + 1;
				kk = row * col - k;
				sw = 0;
					if (k3 < n3) {
					for (i1 = k; i1 < row * col; i1++) {
						if (b[i1/col][i1%col] > 0)
							kk--;
					}
					if (3*(n3-k3) > kk)
						sw = -1;
					else
						k3++;
				}
				else {
					if (s == 0) {
						sw = 1;
						s  = 1;
						k2++;
					}
					else {
						for (i1 = k; i1 < row * col; i1++) {
							if (b[i1/col][i1%col] > 0)
								kk--;
						}
						if (2*(n2-k2) > kk)
							sw = -1;
						else
							k2++;
					}
				}
				if (sw > 0) {
					for (i1 = 0; i1 < row; i1++) {
						for (i2 = 0; i2 < col; i2++) {
							n = set(n3, n2, k3, k2, s, 0, i1, i2, n, b);
							n = set(n3, n2, k3, k2, s, 1, i1, i2, n, b);
						}
					}
				}
				else if (sw == 0) {
					for (i1 = k; i1 < row * col; i1++) {
						n = set(n3, n2, k3, k2, s, 0, i1/col, i1%col, n, b);
						n = set(n3, n2, k3, k2, s, 1, i1/col, i1%col, n, b);
					}
				}
			}
		}
	
		return n;
	}
}
		

戻る