#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;
}
坑爹的奥数
最新推荐文章于 2024-08-16 16:51:12 发布