【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
2015-07-20 15:54
134 查看
扫雷玩得好还是有点好处的......
这个题一开始像从后向前按照第一排的数字进行DFS 发现自己真傻,先不说这种情况下每个数字的填写情况很多, 还要处理相邻位置的问题。
所以可以对每一位有没有地雷进行枚举。处理每一位的时候,要保证上一个数字是合理的,否则不用进行下去了,类似回溯,注意have变量的处理就好了。
这个题一开始像从后向前按照第一排的数字进行DFS 发现自己真傻,先不说这种情况下每个数字的填写情况很多, 还要处理相邻位置的问题。
所以可以对每一位有没有地雷进行枚举。处理每一位的时候,要保证上一个数字是合理的,否则不用进行下去了,类似回溯,注意have变量的处理就好了。
#include <iostream> #include <stack> using namespace std; //最长 暗示dfs //遇到3 和 0 其实只有一种情况 //遇到2 和 1 有三种情况 //遇到* 有 2+2*3 = 8种情况, //可见如果以数字为dfs的条件的话 很麻烦 还不如直接用0 1 来枚举每个炸弹的位置 //其实如果数据小的话 可以直接遍历所有可能解 然后进行验证 但是因为n过大,全部情况根本没有办法枚举完,另外就是验证的效率很低 //所以还是dfs int n; string nums; bool isMine[100000+10]={false}; void init(){ cin>>n; cin>>nums; } bool have = false; int alreadyHave(int cur){ int res = 0; res += isMine[cur]; if(cur>0) res += isMine[cur-1]; if(cur<n-1) res += isMine[cur+1]; return res; } bool canPut(int cur){ if(nums[cur]=='*') return true; else return ('0' + alreadyHave(cur) ) <= nums[cur]; } bool exactPut(int cur){ if(nums[cur]=='*') return true; else return ('0' + alreadyHave(cur) ) == nums[cur]; } void dfs(int cur){ if(have) return; if(cur<0){ have = exactPut(0); return; } isMine[cur] = true; if((cur == n-1 and canPut(cur)) or (cur<n-1 and exactPut(cur+1)) ) dfs(cur-1); if(have)//不必继续 return; isMine[cur] = false; if((cur == n-1 and canPut(cur)) or (cur<n-1 and exactPut(cur+1)) ) dfs(cur-1); return; } void build(){ dfs(n-1); int ans = 0; for (int i = 0; i < n; ++i) { if(isMine[i]) ans++; } cout<<ans<<endl; for (int i = 0; i < n; ++i) { cout<<isMine[i]; } cout<<endl; } int main(int argc, char const *argv[]) { init(); build(); return 0; }
相关文章推荐
- php实现编辑和保存文件的方法
- 在Python的Django框架中编写编译函数
- python利用requests框架 http请求
- POJ 1191 棋盘分割
- asp.net常用控件之一,GridView
- 集合类之番外篇:深入解析HashMap、HashTable
- 在代码中修改textview的字体颜色(解决只能修改一次的问题)
- hdu 1082
- 洛谷1111 修复公路
- 常见面试第三题之Activity的几种启动模式介绍
- tomcat自动切割日志(Windows)
- 编写一个求n个数的平均值及最小值的程序。要求:程序执行时,用户先由键盘输入n的值,之后输入n个数,最后,程序显示平均值和最小值。
- sublime 多行同时编辑快捷键
- mysql insert语法注意事项(ON DUPLICATE KEY UPDATE )
- test.
- jdk环境变量设置
- 4Sum
- 重寫一下js的alert函數
- High ASCII字符从bat文件到dos控制台的转化问题
- 多年后,才知道自己是多么的无知 !