hiho刷题日记——第三十天小Hi小Ho的惊天大作战:扫雷·一
2015-12-16 09:11
295 查看
题目
简化版扫雷,只有一行。给出一行的周围3格中是雷的数量。
判断哪些一定是雷,一定不是雷。
![](http://media.hihocoder.com/problem_images/20150124/14220960428067.png)
思路
因为给出的信息是环环相扣的,不用一个一个去试。只需要试第一格是否为雷就可以通过数据算出后面是否为雷。
所以只用试两次,
第一次把一格设为雷,算出后面的情况;第二次把第一格设为不是雷,算出后面的情况。
若两次都算出来了,则将两次的情况对比,没有变化的部分就是答案。
若只有一次满足条件,则那一次直接就是答案。
代码
#include<cstdio> #include<cstring> using namespace std; const int MAXN=100000+2; int N,M,a[MAXN],ans[2][MAXN],count[]={0,0},stat1[MAXN],stat2[MAXN]; int t1,t2; bool run(int flag,int *s) { s[0]=0; s[1]=flag; for(int i=1;i<N;i++) { s[i+1]=a[i]-s[i]-s[i-1]; if(s[i+1]!=0 && s[i+1]!=1) return false; } if(a ==s[N-1]+s ) return true; return false; } int main() { scanf("%d",&M); a[0]=0; while(M--) { t1=t2=count[0]=count[1]=0; scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); if(run(0,stat1)) t1=1; if(run(1,stat2)) t2=1; if(t1) { if(t2) { for(int i=1;i<=N;i++) if(stat1[i]==stat2[i]) ans[stat1[i]][count[stat1[i]]++]=i; } else { for(int i=1;i<=N;i++) ans[stat1[i]][count[stat1[i]]++]=i; } } else if(t2) { for(int i=1;i<=N;i++) ans[stat2[i]][count[stat2[i]]++]=i; } printf("%d",count[1]); if(count[1]) { for(int i=0;i<count[1];i++) printf(" %d",ans[1][i]); } printf("\n"); printf("%d",count[0]); if(count[0]) { for(int i=0;i<count[0];i++) printf(" %d",ans[0][i]); } printf("\n"); } return 0; }
相关文章推荐
- 领域驱动设计案例之业务实现1
- daemon虚拟光驱
- Android自定义控件
- iframe的内容增高或缩减时设置其iframe的高度的处理方案
- 软件工程设计之四则运算
- ORA-01502错误成因和解决方法
- css-实现元素垂直居中对齐
- 商务打印迅猛发展,爱普生如何开启新时代
- time opt
- 测试用例编写(模板)
- js设置元素垂直居中
- String的一些常用技巧
- 扩大online redo增加日志组
- 关于Hessian的入门知识和性能测试指标
- IOS---UIColor RGB颜色对照表
- myeclipse启动卡死解决办法
- 模板方法(Template Method)模式
- [转]什么叫工作到位?这八张图深刻告诉你
- 腾讯+网易单季手游收80亿,占行业7成
- 相对路径和绝对路径