坑爹的奥数

#include<iostream>
using namespace std;
int a[10], book[10], total = 0;
void DFS(int step)//step表示站在第几个盒子面前
{
	int i;
	if (step == 10)//如果站在第十个盒子面前,则表示前9个盒子已经放好扑克牌
	{
		//判断是否满足等式
		if (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+1,并打印这个解
			total++;
			cout << a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] <<'='<<a[7] * 100 + a[8] * 10 + a[9];
			cout << endl;
		}
		return;//返回之前的一步(最近调用的地方)
	}
	//此时站在弟step个盒子面前,应该放那张牌呢?
	//按照1、2、3......n的顺序一一尝试
	for (i = 1; i <= 9; i++)
	{
		//判断扑克i是否还在手上
		if (book[i] == 0)//book[i]为0表示扑克牌还在手上
		{
			//开始尝试使用扑克i
			a[step] = i;//将扑克i放入到第step个盒子中
			book[i] = 1;//将book[i]的值设为1,表示扑克牌i已经不在手上
			//第step个盒子已经放置好扑克牌,走到下一个盒子面前
			DFS(step + 1);//这里通过函数递归调用来实现(自己调用自己)
			//这里非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
			book[i] = 0;
		}
	}
	return;
}
int main()
{
	DFS(1);//首先站在第一个盒子面前
	cout << total / 2 << endl;
	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值