【习题详解】搜索

搜索习题详解

分数字

题目描述
现有N件不可区分的物品,将它们分成10份,要求每份在1~3件之间,问有多少种方案,并按字典序输出所有方案。
输入格式
一个整数,表示N<=10000N<=10000。
输出格式
第一行一个数M,表示方案数。
接下来M行每行10个整数,表示1种方案。
样例数据
input

11
output
10
1 1 1 1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 2 1
1 1 1 1 1 1 1 2 1 1
1 1 1 1 1 1 2 1 1 1
1 1 1 1 1 2 1 1 1 1
1 1 1 1 2 1 1 1 1 1
1 1 1 2 1 1 1 1 1 1
1 1 2 1 1 1 1 1 1 1
1 2 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1

十重循环,暴力枚举。

#include<bits/stdc++.h>
using namespace std;
int dd[100000][10];
int main()
{
   
	freopen("allot.in","r",stdin);
	freopen("allot.out","w",stdout);
	int n,ans=0;
	cin>>n;
	for (int a=1;a<=3;++a)
	    for (int b=1;b<=3;++b)
	        for (int c=1;c<=3;++c)
	            for (int d=1;d<=3;++d)
	                for (int e=1;e<=3;++e)
	                    for (int f=1;f<=3;++f)
	                        for (int g=1;g<=3;++g)
	                            for (int h=1;h<=3;++h)
	                                for (int i=1;i<=3;++i)
	                                    for (int j=1;j<=3;++j)
	                                        if (a+b+c+d+e+f+g+h+i+j==n)
	                                        {
   
	                                        	ans++;
	                                        	dd[ans][1]=a;
	                                        	dd[ans][2]=b;
	                                        	dd[ans][3]=c;
	                                        	dd[ans][4]=d;
	                                        	dd[ans][5]=e;
	                                        	dd[ans][6]=f;
	                                        	dd[ans][7]=g;
	                                        	dd[ans][8]=h;
	                                        	dd[ans][9]=i;
	                                        	dd[ans][10]=j;
	                                        }
	printf("%d\n",ans);
	for (int i=1;i<=ans;++i) 
	    for (int j=1;j<=10;++j)
	        if (j==10) cout<<dd[i][j]<<'\n';
	            else cout<<dd[i][j]<<' ';
	fclose(stdin);fclose(stdout);
	return 0;
}

流星雨

题目描述
流星雨是美丽的,但是流星落下来也能砸死人的。
有一大片流星要在海亮教育园的操场落下,而小x恰好在操场数星星。小x面临最大的问题不是浪漫,而是保住小命。
我们把海亮教育园的操场认为是坐标系的第一象限(以样例解释的图例为准)。小x现在位于坐标系的原点。
现在有M颗流星会落在海亮教育园的操场上,其中第i颗流星会在时刻T_i砸在坐标为(X_i, Y_i)的格子里。流星的力量会将它所在的格子,以及周围4个相邻的格子都化为焦土,当然小x也无法再在这些格子上行走,这样他会被烧伤。
小x从0时刻开始逃离,他只能上下左右移动,并且一个时刻只能移动一个格子,当然,这个格子必须是完好的。
现在小x想知道,最少经过多少时刻,他可以到达一个安全的格子。
输入格式
一个正整数M 接下来M行,每行3个整数Xi,Yi和Ti。分别表示第i颗流星落下的坐标和时间。保证所有坐标都在第一象限。
输出格式
一个整数,表示最少逃离时刻。如果逃离不了,那么输出-1,表示小x肯定被流星砸着了。
样例数据
input

4
0 0 2
2 1 2
1 1 2
0 3 5
output
5

题解
这道题问的是逃亡的最小时间,显然求诸如最小距离之类的问题我们都应该选择bfs来完成。
我们先预处理每一个点变成不能经过的点的最小时间,永远安全的点为正无穷。
从起点开始跑广搜,只要扩展节点的时候判断当前实现经过该节点是否安全即可。
CODE

#include<bits/stdc++.h>
using namespace std;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值