铺瓷砖问题

fhlkm 2019-02-28 07:28:46
用“1*2”与“1*3”两种类型的瓷砖铺地面

1. 要求相邻的两行不能有对齐的瓷砖 ,当然边界的对齐除外。
例子:
铺一个 2*5的地面, 第一行是: (2,3),第二行是(2,3),第一块砖是对齐的,解法是错误的。如果 第一行 (3,2),第二行(2,3),正确的解法。

2. 地面必铺满,不能有空隙

给出了地面的长度与宽度,求有多少种铺法?

例如:
地面 10 *12(10行,12列), 有1586种

地面 04 *14(4行,14列), 有0188种

地面 10 *08(10行,8列), 有0188种


大家有没有思路,提供一下? 谢谢了
...全文
497 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx3275852 2019-03-13
  • 打赏
  • 举报
回复
引用 2 楼 fhlkm 的回复:
你的解法是对的,10行8列和你提供的答案不同,结果是4。我写错了。
那么到底有巧方法么?我感觉有更好的方法。
fhlkm 2019-03-05
  • 打赏
  • 举报
回复
你的解法是对的,10行8列和你提供的答案不同,结果是4。我写错了。
引用 1 楼 lx3275852 的回复:
应该有巧方法吧,我觉得应该找找规律。 不过我只会暴力递推,就是用回溯法,把所有可能的解法罗列一遍…… 大概描述一下,深搜方式,从第一行开始,一个瓷砖一个瓷砖的试,先尝试放个1*2的,然后挨个摆瓷砖。试玩所有的方案,再把1*2的曲调换成1*3的再试试…… 没有别的编译器,随便打开了网页上个js代码示意一下吧……

//递归函数,a是当前行,已经摆了几列; b是当前行, m总行数,n总列数, p是记录每一行哪个位置有缝的数组,为解决下一行不重复
function test( a, b, m, n, p )
{	
	if( b == m )
    {	//全部排满,铺法计数+1
		++s;
		return ;
    }
	else if( a == n )
    {	//当前行排满,递归排下一行
		if( p.length < m )
			p.push( [] );
		test( 0, b + 1, m, n, p, s );
		return;
    }
	else if( a > n )
		return ;
	//尝试铺1*2,条件不能超出总列,第一行无条件排,第二行开始要看前一排的缝
	if( a + 2 <= n && ( b == 0 || !p[b-1].includes( a + 2 ) || a + 2 ==n ) )
    {
		p[b].push( a + 2 );
		test( a + 2, b, m, n, p );
		p[b].pop();
    }
	//尝试铺1*3,条件不能超出总列,第一行无条件排,第二行开始要看前一排的缝
	if( a + 3 <= n && ( b == 0 || !p[b-1].includes( a + 3 ) || a + 3 ==n ) )
    {
		p[b].push( a + 3 );
		test( a + 3, b, m, n, p );
		p[b].pop();
    }
}

//测试,s表示铺法总数,p是初始化数组
s=0;p=[[]];test( 0, 0, 2, 5, p );console.log(s);
s=0;p=[[]];test( 0, 0, 10, 12, p );console.log(s);
s=0;p=[[]];test( 0, 0, 4, 14, p );console.log(s);
s=0;p=[[]];test( 0, 0, 10, 8, p );console.log(s);

/*输出结果
2
1586
188
4
*/
计算出10行8列和你提供的答案不同,结果是4,不是188。其他结果一致。 看看有没有好一些的方法,学习一下。
lx3275852 2019-03-01
  • 打赏
  • 举报
回复
应该有巧方法吧,我觉得应该找找规律。 不过我只会暴力递推,就是用回溯法,把所有可能的解法罗列一遍…… 大概描述一下,深搜方式,从第一行开始,一个瓷砖一个瓷砖的试,先尝试放个1*2的,然后挨个摆瓷砖。试玩所有的方案,再把1*2的曲调换成1*3的再试试…… 没有别的编译器,随便打开了网页上个js代码示意一下吧……

//递归函数,a是当前行,已经摆了几列; b是当前行, m总行数,n总列数, p是记录每一行哪个位置有缝的数组,为解决下一行不重复
function test( a, b, m, n, p )
{	
	if( b == m )
    {	//全部排满,铺法计数+1
		++s;
		return ;
    }
	else if( a == n )
    {	//当前行排满,递归排下一行
		if( p.length < m )
			p.push( [] );
		test( 0, b + 1, m, n, p, s );
		return;
    }
	else if( a > n )
		return ;
	//尝试铺1*2,条件不能超出总列,第一行无条件排,第二行开始要看前一排的缝
	if( a + 2 <= n && ( b == 0 || !p[b-1].includes( a + 2 ) || a + 2 ==n ) )
    {
		p[b].push( a + 2 );
		test( a + 2, b, m, n, p );
		p[b].pop();
    }
	//尝试铺1*3,条件不能超出总列,第一行无条件排,第二行开始要看前一排的缝
	if( a + 3 <= n && ( b == 0 || !p[b-1].includes( a + 3 ) || a + 3 ==n ) )
    {
		p[b].push( a + 3 );
		test( a + 3, b, m, n, p );
		p[b].pop();
    }
}

//测试,s表示铺法总数,p是初始化数组
s=0;p=[[]];test( 0, 0, 2, 5, p );console.log(s);
s=0;p=[[]];test( 0, 0, 10, 12, p );console.log(s);
s=0;p=[[]];test( 0, 0, 4, 14, p );console.log(s);
s=0;p=[[]];test( 0, 0, 10, 8, p );console.log(s);

/*输出结果
2
1586
188
4
*/
计算出10行8列和你提供的答案不同,结果是4,不是188。其他结果一致。 看看有没有好一些的方法,学习一下。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧