ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

枚举的例子

2021-07-20 12:59:49  阅读:194  来源: 互联网

标签:10 ++ sum int 枚举 例子 火柴


坑爹的奥数

将数字1-9分别填入9个框中,每个数字只能使用一次使得等式成立,求一共会有多少种组合。
输出的时候要除以2.因为173+286=459与286+173=459是同一种组合
根据枚举的思想,就枚举每一位上所有可能的数,但是这样太麻烦了。所以我们可以用一个数组来代替之前出现的9个循环变量,然后再用一个book数组来标记1-9每个数字是否出现过了,默认为0,出现1就表示出现过。然后就去判断book数组中有多少个1,如果恰好有9个1则表示1-9每个数字有且只有出现过1次。

#include<stdio.h>
int main()
{
	int a[10],i,total=0,book[10],sum;
	for(a[1]=1;a[1]<=9;a[1]++)
		for(a[2]=1;a[2]<=9;a[2]++)
			for(a[3]=1;a[3]<=9;a[3]++)
				for(a[4]=1;a[4]<=9;a[4]++)
					for(a[5]=1;a[5]<=9;a[5]++)
						for(a[6]=1;a[6]<=9;a[6]++)
							for(a[7]=1;a[7]<=9;a[7]++)
								for(a[8]=1;a[8]<=9;a[8]++)
									for(a[9]=1;a[9]<=9;a[9]++)
									{
										for(i=1;i<=9;i++)//初始化book数组
											book[i]=0;
										for(i=1;i<=9;i++)//如果某个数出现过就标记一下
											book[a[i]]=1;
										//统计共出现了多少个不同的数
										sum=0;
										for(i=1;i<=9;i++)
										sum+=book[i];
										//如果正好出现了9个不同的数,并且满足等式条件,就输出
										if(sum==9&&a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9])
										{
										total++;
										printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
										}
									}
							printf("tatal=%d",total/2);
							getchar();getchar();
							return 0;
}

炸弹人

墙用#表示,这里有两种墙,一种是可以被炸掉的,另一种是不能被炸掉的。由于现在只有一枚炸弹,所以都用#来表示,炸弹是不能穿墙的。敌人用G表示,空地用。表示,炸弹只能放在空地上。

思路:
①需要一个二维数组来存储地图;
②炸弹爆炸的方向是沿上下左右四个方向,所以在对每个点进行枚举的时候,需要沿着上下左右四个方向分别统计可以消灭的敌人的数目,最终输出可以消灭敌人最多的那个点。以向下统计为例,向下就是纵坐标不变,横坐标每次加一,直到遇到墙为止。

#include<stdio.h>
int main()
{
	char a[20][21];//假设这里的地图大小不超过20*21
	int i,j,sum,map=0,p,q,x,y,n,m;
	//读入n和m,n表示有多少行字符,m表示每行有多少列
	scanf("%d %d",&n.&m);
	//读入n行字符
	for(i=0;i<=n-1;i++)
		scanf("%s",a[i]);
	//用两重循环枚举地图中的每一点
	for(i=0;i<=n-1;i++)
	{
		for(j=0;j<=m-1;j++)
		{
			//首先判断这个点是不是平地,是平地才可以被放置炸弹
			if(a[i][j]=='.')
			{
				sum=0;//sum用来计数,即可以消灭的敌人数,所以需要初始化为0
				//将当前坐标i,j复制到两个新变量x,y中,以便向上下左右四个方向分别统计可以消灭的敌人数
				//向上统计可以消灭的敌人数
				x=i;y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续
				{
					//如果当前是敌人,则进行计数
					if(a[x][y]=='G')
						sum++;
					//x--的作用是继续向上统计
					x--;
				}
				//向下统计可以消灭的敌人数
				x=i;y=j;
				while(a[x][y]!='#')
				{
					if(a[x][y]=='G')
						sum++;
					//x++的作用是继续向下统计
					x++;
				}
				//向左统计可以消灭的敌人数
				x=i;y=j;
				while(a[x][y]!='#')
				{
					if(a[x][y]=='G')
						sum++;
					//y--的作用是继续向左统计
					y--;
				}
				//向右统计可以消灭的敌人数
				x=i;y=j;
				while(a[x][y]!='#')
				{
					if(a[x][y]=='G')
						sum++;
					//y++的作用是继续向右统计
					y++;
				}
				//更新map值
				if(sum>map)
				{
					//如果当前点所能消灭的敌人总数大于map,则更新map
					map=sum;
					//并用p和q来记录当前点的坐标
					p=i;q=j;
				}
			}
		}
	}
	printf("将炸弹放置在(%d %d),最多可以消灭%d个敌人\n",p,q,map);
	getchar();getchar();
	return 0;
}

火柴棍等式

现在小恒有n根火柴,希望评出A+B=C的等式。等式中的A,B,C均是用火柴棍拼出来的整数(若该数非零,则最高位不能是0)
数字0-9的拼法
注意:
①加号与等号各自需要两根火柴棍
②如果A!=B,则A+B=C与B+A=C视为不同的等式
③所有的火柴棍都必须用上

现假设小恒手上有m根(m<=24)火柴棍,那么小恒究竟可以拼出多少个不同的形如A+B=C的等式呢?规定时间是1秒。

思路:最简单的办法就是枚举A,B,C。A,B,C枚举的范围是0-11111.因为题目中最多有24根火柴,出去+和=占用的4根火柴棍,最多剩下20根火柴棍。而0-9这10个数字之中,数字1需要用到的火柴棍最少,只需要2根火柴。而20根火柴最多能组成10个1,所以A+B=C这个等式中A,B,C中的任意一个数都不能超过111111.
我们通过枚举A,B,C通过A+B=C算出来。

#include<stdio.h>
int fun(int x)
{
	int num=0;//用来计数的变量,一定要记得初始化
	int f[10]={6,2,5,5,4,5,6,3,7,6};//用一个数组来记录0-9每个数字需要用多少根火柴棍
	while(x/10!=0)//如果x/10的商不等于0的话,说明这个数至少有两位
	{
		//获得x的末尾数字并将此数字所需要用到的火柴棍根数累加到num中
		num+=f[x%10];
		x=x/10;
	}
	//最后再加上此时x所需用到的火柴棍根数(此时x一定是一位数)
	num+=f[x];
	return num;//返回需要火柴棍的总根数
}
int main()
{
	int a,b,c,m,i,sum=0;//sum是用来计数的,因此一定要初始化为0
	scanf("%d",&m);//读入火柴棍的个数
	//开始枚举a和b
	for(a=0;a<=11111;a++)
	{
		for(b=0;b<=11111;b++)
		{
			c=a+b;
			if(fun(a)+fun(b)+fun(c)==m-4)
			{
				printf("%d+%d=%d\n",a,b,c);
				sum++;
			}
		}
	}
	printf("一共可以拼出%d个不同的等式",sum);
	getchar();getchar();
	return 0;
}

在这里插入图片描述

数的全排列

求123的全排列,用三重嵌套循环就可以搞定

for(a=1;a<=3;a++)
	for(b=1;b<=3;b++)
		for(c=1;c<=3;c++)
			if(a!=b&&a!=c&&b!=c)
				printf("%d%d%d\n",a,b,c);

标签:10,++,sum,int,枚举,例子,火柴
来源: https://blog.csdn.net/m0_47531010/article/details/118903289

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有