- 问题描述
数字1,2,…,9这9个数字填入以下含加减乘除与乘方的综合运算式中的9个□中,使得该式成立
□^□+□□÷□□-□□×□=0
要求数字1,2,…,9这9个数字在各式中都出现一次且只出现一次,且约定数字“1”不出现在乘、乘方的一位数中(即排除各式中的各个1位数为1这一平凡情形,前两个方框和最后一个不可以为1)。 算法分析
(1)、可以使用最简单的枚举,设置9重循环,并且还要判断9个数不可以重复,枚举完每一种情况后再判断该情况是不是正确的
(2)、在使用穷举时,可以根据一些条件的判断来缩短枚举的次数
(3)、实际上上面的问题也就是1-9的全排列,可以用回溯法生成1-9的全排列,然后判断每一种情况是否合理程序代码
/*本实本分的穷举*/
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int arr[9] = {0};
for (arr[0]=1; arr[0]<=9; ++arr[0])
for (arr[1]=1; arr[1]<=9; ++arr[1])
for (arr[2]=1; arr[2]<=9; ++arr[2])
for (arr[3]=1; arr[3]<=9; ++arr[3])
for (arr[4]=1; arr[4]<=9; ++arr[4])
for (arr[5]=1; arr[5]<=9; ++arr[5])
for (arr[6]=1; arr[6]<=9; ++arr[6])
for (arr[7]=1; arr[7]<=9; ++arr[7])
for (arr[8]=1; arr[8]<=9; ++arr[8])
{
bool flag = false;
//判断是否重复
for (int i=0; i<8 && !flag; ++i)
{
for (int j=i+1; j<9; ++j)
{
if (arr[i] == arr[j])
{
flag = true;
break;
}
}
}
if (flag)
continue;
int tmp = (int)pow(arr[0], arr[1]);
int tmp1 = arr[2] * 10 + arr[3];
int tmp2 = arr[4] * 10 + arr[5];
int tmp3 = (arr[6] * 10 + arr[7]) * arr[8];
if (tmp1 == (tmp3-tmp)*tmp2)
{
//输出结果
for (int i=0; i<9; ++i)
{
cout << arr[i] << ' ';
}
cout << endl;
}
}
return 0;
}
/*使用DFS模拟全排列*/
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> v;
bool Single(int num)
{
for (int i=0; i<v.size(); ++i)
{
if (v[i] == num)
return false;
}
return true;
}
void DFS(int n)
{
if (n == 0)
{
int tmp = (int)pow(v[0], v[1]);
int tmp1 = v[2] * 10 + v[3];
int tmp2 = v[4] * 10 + v[5];
int tmp3 = (v[6] * 10 + v[7]) * v[8];
if (tmp1 == (tmp3-tmp)*tmp2)
{
//输出结果
for (int i=0; i<9; ++i)
{
cout << v[i] << ' ';
}
cout << endl;
}
return;
}
for (int i=1; i<=9; ++i)
{
if (Single(i))
{
v.push_back(i);
DFS(n-1);
v.erase(v.end()-1);
}
}
}
int main()
{
DFS(9);
return 0;
}
本文介绍了一个利用穷举法解决数字1到9填充运算式使其成立的问题。通过对各种条件的判断和限制,如禁止数字1出现在乘法和乘方中,以及不允许数字重复,最终通过回溯法生成可能的全排列并验证每种情况的正确性。
4545

被折叠的 条评论
为什么被折叠?



