用1 x 2的矩形填滿M x N的矩形有多少種方案

2020-10-12 22:00:10
public class Solution {

public static int qiejuzhen(int length,int high)
{
  /*
   result陣列大小為1,用來放答案,當然,將result設為static int型別也是可以的
  */
    if((length*high)%2!=0)return 0;
    //初始化時result[0]==0;
     int[]result=new int[1];	
     sub(new boolean[length][high],length*high,result,0);
     return result[0];
}
/*
flag[][]用來標誌哪些位置已經被分配,哪些位置沒有被分配
left用來指代還有多少位置沒有被分配
本演演算法為了去重,規定每一行必須分配完才能繼續分配下一行
row代表的就是已經分配到第幾行了
*/
public static void sub(boolean [][]flag,int left,int[]result,int row)
{
//當未分配的位置為0時,答案加1
	if(left==0)
	{
		result[0]++;
		return;
	}
	/*
	因為前面row-1行已經被分配完畢了,所以從第row行開始分配就
	可以了
	*/
	for(int i=row;i<flag.length;i++)
	{
		for(int j=0;j<flag[0].length;j++)
		{
			if(flag[i][j]==true)continue;
			if(i<flag.length&&j+1<flag[0].length&&flag[i][j+1]==false)
			{
				flag[i][j]=true;
				flag[i][j+1]=true;
				sub(flag,left-2,result,i);
				flag[i][j]=false;
				flag[i][j+1]=false;
				
			}
			if(i+1<flag.length&&j<flag[0].length&&flag[i+1][j]==false)
			{
				flag[i][j]=true;
				flag[i+1][j]=true;
				sub(flag,left-2,result,i);
				flag[i][j]=false;
				flag[i+1][j]=false;
			}
			/*
			這裡的return解釋一下,在此處flag[i][j]==false,不符合每一行必須分配完才能分配下一行的規定,
			因為接下來就算是j++,也不會再次為flag[i][j]進行分配
			*/
			return;
		}
	}
}

public static void main(String[] args) {
  int length=3;
  int high=4;
	System.out.println(qiejuzhen(length,high));
}
}