33,007
社区成员
发帖
与我相关
我的任务
分享
//递归函数,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。其他结果一致。
看看有没有好一些的方法,学习一下。