用1 x 2的矩形填满M x N的矩形有多少种方案

本文介绍了一个关于切矩阵的问题,并提供了一种递归算法来计算特定条件下矩阵的切分方式总数。该算法通过使用布尔型二维数组跟踪已分配的位置来避免重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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));
}
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值