SSL-练习题目:种树 题解

探讨在6*6方格中种植24棵树,确保每行每列各有4棵树的所有可能方案总数。采用类似八皇后问题的解法,通过递归遍历并计数有效布局。

种树(normal)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:213 Accepted:114

Description

  在6*6的方格地盘中,种植24颗树,使每行、每列都有4颗树。
  求出所有可能的种植方案总数。
  种植方案的说明:输出一个6*6的矩阵,种树的方格用“*”表示,没种树的用“.”表示。
  如下是一种方案((样例仅说明格式,并不代表结果)
****..
..****
**..**
..****
****..
**..**
 

Input

Output

一个数即总数

Sample Input


Sample Output

//以下表示其中的10种,不需要输出,输出总数即可
Case 1:
****..
****..
**..**
**..**
..****
..****
Case 2:
****..
****..
**..**
*.*.**
.*.***
..****
Case 3:
****..
****..
**..**
*.*.**
..****
.*.***
Case 4:
****..
****..
**..**
*..***
.**.**
..****
Case 5:
****..
****..
**..**
*..***
..****
.**.**
Case 6:
****..
****..
**..**
.**.**
*..***
..****
Case 7:
****..
****..
**..**
.**.**
..****
*..***
Case 8:
****..
****..
**..**
.*.***
*.*.**
..****
Case 9:
****..
****..
**..**
.*.***
..****
*.*.**
Case 10:
****..
****..
**..**
..****
**..**
..****

Source

elba

#include
#include
using namespace std;
int s,l[7];
void trees(int x,int k1,int k2)
{
if (l[k1]>1 || l[k2]>1) return;//判断该列还可不可以插入空格
if (x==6)//退出条件
{
s++;
return; 
}
l[k1]++;
l[k2]++;//该列空格的数量加1
for (int i=1;i<=5;i++)
 for (int j=i+1;j<=6;j++)
   trees(x+1,i,j);
l[k1]--;
l[k2]--;//回溯
}
int main()
{ 
for (int i=1;i<=5;i++)
 for (int j=i+1;j<=6;j++)
   trees(1,i,j);
cout<<s;
}

题解:

本题有两种解法,第一种是一个一个格子决定种还是不种,可是这样时间会比较久,所以我就想到了用八皇后的做法,

for (int i=1;i<=5;i++)
  for (int j=i+1;j<=6;j++)
    trees(x+1,i,j);

首先一行的树要4颗,这样循环会比较麻烦,那么就可以循环空位的地方,x表示行数,i和j表示空位的位置。然后用变量L表示该列有多少个空位,最多2个。然后当列数到了6行之后就可以退出累加了。

转载于:https://www.cnblogs.com/sslwyc/p/9218664.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值