暴力搜索是一个有趣的东西。至少刘汝佳是这么认为的。编程之美的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位数:

vector<int> res;
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<string> results;
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

哑谜,回文和暴力之美相关推荐

  1. 判断回文和查询最大公共字符串

    一:判断回文 package cn.com.zzn.demo; /**** 判断回文* **/ public class HuiWen {public static void main(String[ ...

  2. 算法——暴力之美(volence‘s beautify of algorithm)

    暴力算法(volence's beautify of algorithm) 思想:利用暴力法的思想找到所有的解,然后从中选出符合问题要求的解 算法总结:暴力法的优点是实现简单,容易编程,但是往往会消耗 ...

  3. leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  4. 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  5. java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  6. 素数回文(来自计蒜客T1986题目)

    题目: 蒜头君对既是素数又是回文的数特别感兴趣.比如说 151 既是素数又是个回文数.回文数是指从左到右读和从右到左读都一样的数. 现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a ...

  7. c语言原始,[蓝桥杯][历届试题]回文数字 最原始的方法(C语言代码)

    解题思路: 注意事项:C语言用bool类型要加头文件 #include 参考代码: #include #include bool JudgePalindrome(int a) { int i,j,n= ...

  8. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  9. Java Longest Palindromic Substring(最长回文字符串)

    假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padro ...

最新文章

  1. 全面预测我国量子通信市场规模及发展趋势
  2. DDD领域驱动之干货 (一)
  3. ROS 与 Matlab/Simulink联合仿真测试(1)
  4. 数字电路中的建立时间与保持时间
  5. spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明
  6. GroupBy()方法
  7. 用javascript操作xml
  8. 非标机械设计该怎么做,老机械工程师告诉你
  9. 少儿编程之Scratch入门汇总篇
  10. 职称英语 计算机哪报名,职称计算机考试报名
  11. 【编程开发】之 Java 实现邮件发送
  12. 贴吧顶贴_一看就懂一学就会的技术,实战干货分享-万能的小胡
  13. Numerical Analysis(by Timothy Sauer) Notes
  14. 硬盘损坏的解决方法(MBR主引导记录的恢复)
  15. IntelliJ IDEA-ssm使用IDEA导入一个Maven风格的ssm项目
  16. RealmObject-粗心操作引发的巨坑
  17. 明瞳智控最佳实践--国标设备实战接入
  18. java-JQuery的使用
  19. 计算机未连接到网络但是可以上网,win10系统能上网但图标显示未连接的解决办法...
  20. 中国家庭收入调查数据(CHIP)

热门文章

  1. linux环境下nacos的安装+启动,阿里云服务器安装nacos
  2. Docker学习(七)-----Docker安装nginx
  3. jieba中文分词源码分析(四)
  4. 使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目
  5. CPU三级缓存技术解析
  6. CodeGen结构循环回路
  7. Supervisor使用详解
  8. 牛客网里刷题:JS获取输入的数组
  9. Ubuntu 系统安装Visual Studio Code
  10. Android selector 使用注意.