哑谜,回文和暴力之美
暴力搜索是一个有趣的东西。至少刘汝佳是这么认为的。编程之美的4.10节就是典型的暴力题。虽然作者将其难度定义为一颗星,但却不能因此认为这个类型的问题就是那么容易的,很多可能需要一些有创造力的想法。
不妨试试下面这几道题:
Island of Logic:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=107&page=show_problem&problem=533
Meta-loopless sort:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=107&page=show_problem&problem=46
How big is it?:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=953
No tipping:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=109&page=show_problem&problem=1064
Addition chains:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=109&page=show_problem&problem=470
我先把其中的例题用深搜来试解一下。因为题目的解空间非常小,所以没有做什么优化。
关于节后问题:问题1,N位的总回文数为:9*pow(10, n/2 + n&1 - 1)。问题2见下面的代码。
1. 神奇的9位数:
int used[10];
void dfs(int i = 1, int v = 0) {
if (i == 10) {
res.push_back(v);
return;
}
for (int k = 1; k <= 9; ++k) {
if (used[k]) continue;
int vv = v*10 + k;
if (vv%i) continue;
used[k] = 1;
dfs(i+1, vv);
used[k] = 0;
}
}
int main() {
dfs();
for (size_t i = 0; i < res.size(); ++i)
cout<<res[i]<<'\n';
return 0;
}
2. 人过大佛寺×我=寺佛大过人以及问题2
下面的程序没有经过优化,所以会比较慢一点。另外,评估函数也只是简单满足需要。
vector<int> tested;
vector<int> used;
string equation;
int base;
bool satisfy(const string& s) {
char* next = 0;
int r = strtoul(s.c_str(), &next, base);
while (*next != '=') {
char op = *next++;
int t = strtoul(next, &next, base);
switch(op) {
case '+': r += t; break;
case '-': r -= t; break;
case '*': r *= t; break;
case '/': r /= t; break;
}
}
int b = strtoul(++next, 0, base);
return r == b;
}
void init(const string& str, int b = 10) {
equation = str;
base = b;
used.assign(base, 0);
tested.assign(26, 0);
results.clear();
}
void dfs(size_t i = 0) {
while (i < equation.length() && !islower(equation[i])) ++i;
if (i >= equation.length()) {
if (satisfy(equation))
results.push_back(equation);
return;
}
char c = equation[i], cc = c;
if (tested[c - 'a']) return;
tested[c - 'a'] = 1;
for (int k = (i == 0 || !isalnum(equation[i-1])); k < base; ++k) {
if (used[k]) continue;
used[k] = 1;
char t = k < 10? '0' + k: 'A' + k - 10;
replace(equation.begin() + i, equation.end(), cc, t);
dfs(i+1);
cc = t; // for next iteration
used[k] = 0;
}
replace(equation.begin() + i, equation.end(), cc, c);
tested[c - 'a'] = 0;
}
void output(ostream& os) {
if (results.size()) {
for (size_t i = 0; i < results.size(); ++i)
os<<results[i]<<'\n';
}
else
os<<"No solution.\n";
}
int main() {
init("abcde*f=edcba", 10);
dfs();
output(cout);
cout<<'\n';
init("he*he=she", 10);
dfs();
output(cout);
cout<<'\n';
init("he*he=she", 16);
dfs();
output(cout);
return 0;
}
转载于:https://www.cnblogs.com/acmaru/archive/2011/03/18/1987923.html
哑谜,回文和暴力之美相关推荐
- 判断回文和查询最大公共字符串
一:判断回文 package cn.com.zzn.demo; /**** 判断回文* **/ public class HuiWen {public static void main(String[ ...
- 算法——暴力之美(volence‘s beautify of algorithm)
暴力算法(volence's beautify of algorithm) 思想:利用暴力法的思想找到所有的解,然后从中选出符合问题要求的解 算法总结:暴力法的优点是实现简单,容易编程,但是往往会消耗 ...
- leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- 素数回文(来自计蒜客T1986题目)
题目: 蒜头君对既是素数又是回文的数特别感兴趣.比如说 151 既是素数又是个回文数.回文数是指从左到右读和从右到左读都一样的数. 现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a ...
- c语言原始,[蓝桥杯][历届试题]回文数字 最原始的方法(C语言代码)
解题思路: 注意事项:C语言用bool类型要加头文件 #include 参考代码: #include #include bool JudgePalindrome(int a) { int i,j,n= ...
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...
- Java Longest Palindromic Substring(最长回文字符串)
假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padro ...
最新文章
- 全面预测我国量子通信市场规模及发展趋势
- DDD领域驱动之干货 (一)
- ROS 与 Matlab/Simulink联合仿真测试(1)
- 数字电路中的建立时间与保持时间
- spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明
- GroupBy()方法
- 用javascript操作xml
- 非标机械设计该怎么做,老机械工程师告诉你
- 少儿编程之Scratch入门汇总篇
- 职称英语 计算机哪报名,职称计算机考试报名
- 【编程开发】之 Java 实现邮件发送
- 贴吧顶贴_一看就懂一学就会的技术,实战干货分享-万能的小胡
- Numerical Analysis(by Timothy Sauer) Notes
- 硬盘损坏的解决方法(MBR主引导记录的恢复)
- IntelliJ IDEA-ssm使用IDEA导入一个Maven风格的ssm项目
- RealmObject-粗心操作引发的巨坑
- 明瞳智控最佳实践--国标设备实战接入
- java-JQuery的使用
- 计算机未连接到网络但是可以上网,win10系统能上网但图标显示未连接的解决办法...
- 中国家庭收入调查数据(CHIP)