穷举法之完美综合式
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的全排列,然后判断每一种情况是否合理
程序代码
数字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; }
相关文章推荐
- 泛型方法的定义与使用
- GitHub与StackOverFlow等等
- 面试题:什么叫二叉查找树
- 2016年4月微软在线笔试第二题-403 forbidden
- 泛型类的定义与使用
- 半平面交初级
- 环境——卸载redhat6.5的yum,安装centos6的yum,配置第三房yum源
- java第五次作业
- iOS小技巧 - 选择编译
- HDU 3367 Pseudoforest(最大生成树+并查集)
- Fragment嵌套ViewPager,viewpager切换的时候,手机出现白屏
- 泛型
- Android学习之Android 5.0分享动画实现微信点击全屏效果
- Python3.5.1 百度翻译代码
- 'hibernate.dialect' must be set when no Connection avalable
- iOS 8 系统自带BlurEffect 毛玻璃特效
- 求两个有序数组的共有元素
- 欢迎使用CSDN-markdown编辑器
- 面试题:什么叫B树
- golang append