博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2004【虫食算】(DFS)
阅读量:5222 次
发布时间:2019-06-14

本文共 2591 字,大约阅读时间需要 8 分钟。

这篇文章写得比较详细

对于搜索的优化:

1 从大往小搜

2 从原字符串的最低位开始搜,并且从上往下,这个可以记录在pos数组里

最后就是一些判断的函数了,文章写得挺详细的,看了他的才会写

#include
using namespace std;string a, b, c;bool vis[30];int pos[30], res[30], tot,n;void parse(){ for (int i = n - 1; i >= 0; i--)//从右往左 顺序不能更改变,否则超时 { int a1 = a[i] - 'A', b1 = b[i] - 'A', c1 = c[i] - 'A';//从上到下 if (!vis[a1]) { vis[a1] = true; pos[tot++] = a1; } if (!vis[b1]) { vis[b1] = true; pos[tot++] = b1; } if (!vis[c1]) { vis[c1] = true; pos[tot++] = c1; } }}bool valid()//最终检查{ int jinwei=0,sum=0; for (int i = n - 1; i >= 0; i--) { int a1 = a[i] - 'A', b1 = b[i] - 'A', c1 = c[i] - 'A'; sum = (res[a1] + res[b1]+jinwei) % n; jinwei = (res[a1] + res[b1] + jinwei) / n; if (sum != res[c1]) return false; } if (jinwei != 0) return false; return true;}bool check()//粗略检查{ for (int i = n - 1; i >= 0; i--)//顺序可以改为0~n-1,时间会略有延长 { // 对于一竖排上的3个数 a b c int a1 = a[i] - 'A', b1 = b[i] - 'A', c1 = c[i] - 'A'; if (res[a1] != -1 && res[b1] != -1 && res[c1] != -1) { if ((res[a1] + res[b1]) % n != res[c1] && (res[a1] + res[b1] + 1) % n != res[c1]) return false; } else if (res[a1] != -1 && res[b1] != -1 && res[c1] == -1) { if (vis[(res[a1] + res[b1]) % n] && vis[(res[a1] + res[b1] + 1) % n]) return false; } else if (res[a1] != -1 && res[c1] != -1 && res[b1] == -1 ) //知道a c { if (vis[(res[c1] - res[a1] + n) % n] && vis[(res[c1] - res[a1] - 1 + n) % n]) return false; } else if (res[a1] == -1 && res[b1] != -1 && res[c1] != -1) { if (vis[(res[c1] - res[b1] + n) % n] && vis[(res[c1] - res[b1] - 1 + n) % n]) return false; } } return true;}void dfs(int k){ if (!check()) return; if (k == n) { if (valid()) { for (int i = 0; i < n; i++) cout << res[i] << " \n"[i == n - 1]; exit(0);//直接退出 } return; } for (int i = n-1; i >=0 ; i--)//很重要,顺序不可以改变,否则超时 { if (!vis[i]){ vis[i] = true; res[pos[k]] = i; dfs(k + 1); res[pos[k]] = -1; vis[i] = false; } }}int main(){ cin >> n; cin>>a >> b >> c; parse();//处理pos数组,优化搜索 memset(res, -1, sizeof(res)); memset(vis, false, sizeof(vis));//这里一定要重新清0 dfs(0); return 0;}

 

转载于:https://www.cnblogs.com/xiaoguapi/p/10485794.html

你可能感兴趣的文章
如何为Kafka集群选择合适的Topics/Partitions数量
查看>>
php RSA加密传输代码示例(轉)
查看>>
LOJ #3103. 「JSOI2019」节日庆典
查看>>
正确适配苹果ATS审核要求的姿势
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
jinjia
查看>>
Bootstrap框架
查看>>
Beta冲刺——第一天
查看>>
例1-1
查看>>
java程序员职业规划
查看>>
线程的生命周期
查看>>
Spark性能测试报告与调优参数
查看>>
RecyclerView
查看>>
经济可行性
查看>>
spring源码学习(一)
查看>>
linux环境查看版本信息
查看>>
truncate、delete、drop区别
查看>>
ASP.NET 获得当前网页名字
查看>>
基础练习 龟兔赛跑预测
查看>>
调试Javascript代码(浏览器F12)
查看>>