优雅,实在是太优雅了,这波10个for循环暴力枚举烤鸡

本文介绍了一道趣味编程题:通过暴力枚举和深度优先搜索(DFS)算法来找出所有可能的烤鸡配料组合,使得配料总重量等于给定的美味程度。文章提供了两种解题思路的源代码示例。

10个for循环暴力枚举烤鸡

题目来自洛谷https://www.luogu.com.cn/problem/P2089

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等),每种配料可以放 111333 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 nnn ,请输出这 101010 种配料的所有搭配方案。

输入格式

一个正整数 nnn,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,101010 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 000

样例输入

11

样例输出

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

提示

对于 100%100\%100% 的数据,n≤5000n \leq 5000n5000

直接开始优雅的暴力烤鸡枚举,第一次看见的时候属实给我震撼了一波,关键更摧毁我三观的是,这代码竟然还过了判题AC了?还能这样玩?现在回想起来,必须得分享快乐,我不允许还有人不知道!


#include<iostream> 
using namespace std; 
int main() { 
	int a,b,c,d,e,f,g,h,i,j,in,x=0; cin>>in; 
	for (a=1;a<=3;a++) { 
		for (b=1;b<=3;b++) { 
			for (c=1;c<=3;c++) { 
				for (d=1;d<=3;d++) { 
					for (e=1;e<=3;e++) { 
						for (f=1;f<=3;f++) { 
							for (g=1;g<=3;g++) { 
								for(h=1;h<=3;h++) { 
									for (i=1;i<=3;i++) { 
										for (j=1;j<=3;j++) { 
											if (a+b+c+d+e+f+g+h+i+j==in) { 
												x++; 
											} 
										} 
									} 
								} 
							} 
						} 
					} 
				} 
			} 
		} 
	} 
	cout<<x<<endl; 
	for (a=1;a<=3;a++) { 
		for (b=1;b<=3;b++) { 
			for (c=1;c<=3;c++) { 
				for (d=1;d<=3;d++) { 
					for (e=1;e<=3;e++) { 
						for (f=1;f<=3;f++) { 
							for (g=1;g<=3;g++) { 
								for(h=1;h<=3;h++) { 
									for (i=1;i<=3;i++) { 
										for (j=1;j<=3;j++) { 
											if (a+b+c+d+e+f+g+h+i+j==in) { 
												cout<<a<<" "; 
												cout<<b<<" "; 
												cout<<c<<" "; 
												cout<<d<<" "; 
												cout<<e<<" "; 
												cout<<f<<" "; 
												cout<<g<<" "; 
												cout<<h<<" "; 
												cout<<i<<" "; 
												cout<<j<<endl; 
											} 
										} 
									} 
								} 
							} 
						} 
					} 
				} 
			} 
		} 
	} 
} //so beautiful!

这波实在是太优雅了!

深度优先搜索正解!

#include<bits/stdc++.h> 
using namespace std; 

int s,flag=0,sum=0;//flag判断是否有解,sum方案总数 
int nice[11],ans[20000][11]; 

void dfs(int dep,int total){//dep代表当前放第几种配料,total代表当前的配料和 
	if(dep==11){//若放到最后一个格子 
		if(total==s){//若所有配料质量之和达到美味程度 
			flag=1; 
			sum++; 
			for(int j=1;j<=10;j++)//存储当前方案 
				ans[sum][j]=nice[j]; 
		} 
		return; 
	} 
	else 
	{ 
		for(int i=1;i<=3;i++){//当前这种配料有三种放法 
			if(total+i>s) break; 
			else{ 
				nice[dep]=i;//存储 
				dfs(dep+1,total+i);//搜索下一种配料 
				nice[dep]=0; 
			} 
		} 
	} 
} 

int main(void){ 
	cin>>s;//输入 
	dfs(1,0); 
	if(flag==1){ 
		cout<<sum<<endl;//输出总数 
		for(int i=1;i<=sum;i++){//输出全部方案 
			for(int j=1;j<=10;j++){ 
				cout<<ans[i][j]<<" "; 
			} 
			cout<<endl; 
		} 
	} 
	else if(flag==0){//若无解 
		cout<<0<<endl; 
	} 
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值