华师一附中OI组
标题:
炸弹坑问题
[打印本页]
作者:
admin
时间:
2018-6-2 18:59
标题:
炸弹坑问题
一排有n个坑,每个坑都可以放炸弹,但是不可以连续m个坑放炸弹,输入n和m,请问有多少种放炸弹的方法。
作者:
admin
时间:
2018-6-2 19:01
显然可以用dfs来做,枚举每个坑是放炸弹还是不放,用s表示当前这一列的连续炸弹数目,要是这个坑不放炸弹,就归0了,这样除了复杂度高点之外,显然是可以出结果的。
作者:
张笑宇
时间:
2018-7-27 20:07
#include<iostream>
using namespace std;
int n,m,ans=0,a[10010];
void dfs(int x)
{
if (x>=n+1)
{
int s=0;
for (int i=1;i<=n;i++)
{
if (a[i]==1) s++;
else s=0;
if (s>=m) return;
}
ans++;
return;
}
a[x]=1;
dfs(x+1);
a[x]=0;
dfs(x+1);
}
int main()
{
cin>>n>>m;
dfs(1);
cout<<ans;
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-27 20:07
全排列 再判断
作者:
黄煦喆
时间:
2018-7-27 20:29
#include<iostream>
using namespace std;
int n,m,ans,a[101],cnt;
void ms(int i,int x)
{
if(i>n)ans++;
else
{
if(x+1<m)
{
a[i]=1;
ms(i+1,x+1);
a[i]=0;
}
ms(i+1,0);
}
}
int main()
{
cin>>n>>m;
ms(1,0);
cout<<ans;
return 0;
}
复制代码
作者:
admin
时间:
2018-7-27 23:12
这个题可以用递推来做的 。
作者:
zhwang
时间:
2018-7-30 00:32
#include<cstdio>
int n,m;
int sum=0;
int book[10001];
void dfs(int step,int x)
{
if(step==m)
{
return;
}
else
{
if(x==n+1)
{
sum++;
return;
}
}
dfs(0,x+1);
dfs(step+1,x+1);
}
int main()
{
scanf("%d%d",&n,&m);
book[1]=1;
dfs(0,1);
printf("%d",sum);
return 0;
}
复制代码
作者:
zhwang
时间:
2018-7-30 00:35
话说我总觉得这题有什么数学公式,但是想不出来,动态规划的话应该就是和‘拖拉机’纸牌游戏一样讨论放与不放写两个类似于数学推倒的关系式,但是写完暴搜好晚了。总感觉上面递推大佬的式子有点奇怪,不知道是自己太蒟蒻了还是真的有问题。
作者:
zhwang
时间:
2018-7-30 00:39
zhwang 发表于 2018-7-30 00:32
喵?book数组好像没有用到啊……好尴尬啊
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2