蓝桥 猜算式
2018-03-20 20:49
218 查看
【题目】
看下面的算式:
□□ 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;
}
看下面的算式:
□□ 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;
}
相关文章推荐
- 蓝桥 猜算式
- 蓝桥 凑算式
- 蓝桥 算法训练 ALGO-116 最大的算式
- 凑算式-蓝桥-全排列
- 最大的算式 蓝桥
- 从蓝桥凑算式得到的全排列新发现
- Reporting Services 中的運算式範例
- 简单的计算器 ~~ 呼呼 支持 +-/* () 运算 输入 算式 就得到结果 栈 ~~
- excel 计算单元格的算式
- 60-思考题(5)-将1到9 这九个数字分成若干个数,满足一定的算式
- 问题四十六: 在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。
- 新秀模拟题③——填写乘法算式
- 第四届蓝桥排它平方数
- 马虎的算式 - 蓝桥杯
- 蓝桥 串的简单处理
- 猜灯谜(蓝桥13年决赛题)
- 用内置工具Word列算式
- 蓝桥题目:特殊回文数
- 蓝桥 大臣的旅费
- 马虎的算式