算法数据结构笔记 枚举

枚举就是猜测每一种可能性,比如1 + [  ] = 3,如果不用代数计算的话,那么就把0~9都尝试一遍,即可得出答案。

 

循环实现的枚举

考虑这样的一个问题,[  ][  ]+[  ][  ] = 51 空格中,数字随意填写,可重复,不考虑0。

我们通过四层for循环,分别遍历1~9暴力枚举所有数字组合可能性,来得出答案。

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++)
		{
			for (int k = 1; k <= 9; k++)
			{
				for (int x = 1; x <= 9; x++)
				{
					if (i * 10 + j + k * 10 + x == 51) //判断是否符合[  ][  ]+[  ][  ] = 51
						printf("%d%d + %d%d = 51\n", i, j, k, x);
				}
			}
		}
	}
	system("pause");
	return 0;
}

运行结果是这样的:

 

递归实现的枚举

这是通过不断调用自己来实现的枚举,他非要重要,这种递归调用可以模拟无限个for。

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int b[10];

void a(int s)
{
	if (s == 5) //s等于5代表这个一个新的组合,可以判断是否合法了
	{
		if (b[1] * 10 + b[2] + b[3] * 10 + b[4] == 51)//判断
			printf("%d%d + %d%d = 51\n", b[1], b[2], b[3], b[4]); //打印
		return;
	}

	for (int i = 1; i <= 9; i++) //遍历1到9
	{
		b[s] = i;//第一次进入s是1,i也是1
		a(s + 1); //然后调用自己,s+1,这样下一次进入就是s就是2
	}
	return;
}

int main()
{
	a(1);
	system("pause");
	return 0;
}

 其结果和之前一样

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值