hihoCoder hiho一下 第五十一周 欧拉路·三
2015-06-22 22:23
302 查看
题目1 : 欧拉路·三
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
小Hi和小Ho破解了一道又一道难题,终于来到了最后一关。只要打开眼前的宝箱就可以通关这个游戏了。宝箱被一种奇怪的机关锁住:
这个机关是一个圆环,一共有2^N个区域,每个区域都可以改变颜色,在黑白两种颜色之间切换。
小Ho控制主角在周围探索了一下,果然又发现了一个纸片:
机关黑色的部分表示为1,白色的部分表示为0,逆时针连续N个区域表示一个二进制数。打开机关的条件是合理调整圆环黑白两种颜色的分布,使得机关能够表示0~2^N-1所有的数字。 我尝试了很多次,终究没有办法打开,只得在此写下机关破解之法。 ——By 无名的冒险者
小Ho:这什么意思啊?
小Hi:我给你举个例子,假如N=3,我们通过顺时针转动,可以使得正下方的3个区域表示为:
因为黑色表示为1,白色表示为0。则上面三个状态分别对应了二进制(001),(010),(101)
每转动一个区域,可以得到一个新的数字。一共可以转动2^N次,也就是2^N个数字。我们要调整黑白区域的位置,使得这2^N个数字恰好是0~2^N-1
小Ho:我懂了。若N=2,则将环上的黑白色块调整为"黑黑白白",对应了"1100"。依次是"11","10","00","01"四个数字,正好是0~3。那么这个"黑黑白白"就可以打开机关了咯?
小Hi:我想应该是的。
小Ho:好像不是很难的样子,我来试试!
提示:有向图欧拉回路
输入
第1行:1个正整数,N。1≤N≤15
输出
第1行:1个长度为2^N的01串,表示一种符合要求的分布方案样例输入
3
样例输出
00010111
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #define eps 1e-8 #define op operator #define MOD 10009 #define MAXN 100100 #define INF 0x7fffffff #define MEM(a,x) memset(a,x,sizeof a) #define ll __int64 const int M=(int)(1<<15); //注意这里是15 using namespace std; int list[M]; int ans[M]; int cnt; int m; void dfs(int v) { int x=(v<<1)&m; if(!list[x]) { list[x]=1; dfs(x); ans[cnt++]=0; } if(!list[x+1]) { list[x+1]=1; dfs(x+1); ans[cnt++]=1; } } int main() { //freopen("ceshi.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF) { MEM(list,0); cnt=0; m=(1<<n)-1; dfs(0); for(int i=1;i<n;i++) printf("0"); // cout<<"cnt "<<cnt<<endl; for(int i=cnt-1;i>n-2;i--) printf("%d",ans[i]); puts(""); } return 0; }
相关文章推荐
- CodeSign error: code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 8.1'
- 《人月神话》-阅读笔记3
- SCU 4444 Travel (2015四川省省赛I题)
- drawSelf(int texId)格式对应
- 关于dubbo的一个demo
- servlet request获取请求行或者请求体中的paramerter,并解决编码问题
- 2015062204 - 编程大师访谈录(2)
- springMVC注解入门
- 建立菜单
- 常对象和常对象成员
- 如何给字符串数组赋值
- Windows的toFileTimeutc时间转为GMT时间
- 场景调研
- 【Linux】Ubuntu 开机默认亮度修改方法
- 堆排序算法学习(C++代码)
- 开始坚持学blog。2015.6.22
- Android显示GIF图片
- Hive中实现增量更新
- [转载]C#时间函数
- 深圳之行---错过