蓝桥 猜算式

题目】 
看下面的算式: 
□□ x □□ = □□ x □□□ 
它表示:两个两位数相乘等于一个两位数乘以一个三位数。 
如果没有限定条件,这样的例子很多。 
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。 
该算式中1至9的每个数字出现且只出现一次! 
比如: 
46 x 79 = 23 x 158 
54 x 69 = 27 x 138 
54 x 93 = 27 x 186 
….. 
请编程,输出所有可能的情况! 
注意: 
左边的两个乘数交换算同一方案,不要重复输出! 
不同方案的输出顺序不重要

解题分析:很明显的排列组合问题,递归解决。比较麻烦的是去重,我写完后在别人博客上有看到有把每个解做成string存到set里的,我麻烦点,用map嵌套set检查头两个乘数来去重

#include <iostream>
#include <map>
#include<set>
using namespace std;
int mark[10];
bool book[10];
map<int,set<int>> m;
void DFS(int deepth)
{
	if (deepth == 10)
	{
		if ((mark[1] * 10 + mark[2])*
			(mark[3] * 10 + mark[4]) ==
			(mark[5] * 10 + mark[6])*
			(mark[7]*100+mark[8]*10+mark[9])
			)
		{
			int x1 = mark[1] * 10 + mark[2];
			int x2=  mark[3] * 10 + mark[4];
			
			if ((m.find(x1) != m.end() && m[x1].find(x2)!=m[x1].end()) ||
				(m.find(x2) != m.end() && m[x2].find(x1)!=m[x2].end()))
			{
				return;
			}
		    m[x1].insert(x2);
		    m[x2].insert(x1);
			printf_s("%d%dx%d%d=%d%d*%d%d%d\n", mark[1], mark[2], mark[3], mark[4], mark[5], mark[6], mark[7], mark[8], mark[9]);
		}
	}
	else
	{
		for (int i = 1; i <= 9; i++)
		{
			if (book[i])
			{
				book[i] = false;
				mark[deepth] = i;
				DFS(deepth + 1);
				book[i] = true;
			}
		}
	}
}
int main()
{
	memset(mark, 0, 10 * sizeof(int));
	memset(book, true, 10 * sizeof(bool));
	m.clear();
	DFS(1);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值