您的位置:首页 > 其它

穷举法之完美综合式

2016-04-15 20:16 281 查看
问题描述

数字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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: