hiho 1182 : 欧拉路·三
1182 : 欧拉路·三
这时题目中给的提示:
小Ho:是这种。每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么。
于是我考虑对于"XYYY",它转动之后能够变成"YYY0"或者"YYY1"。我就将全部的数字0~2^N-1看作2^N个点。连接全部的("XYYY","YYY0"),("XYYY","YYY1")。
比方当N=3时,我得到了这样一个图:

我要做的就是找一条路径,从一个点出发,走过全部的点后。再回到起点。可是我发现好像非常难的样子。
小Hi:那当然了。
你这样构造出来的路径叫做哈密顿回路。不是那么easy能够求解的。
小Ho:哎??那我应该怎么做。
小Hi:事实上你的想法是没问题的,可是须要进行一下变换。在你的构图中我们是用点来表示数字,所以须要经过每个点。假设我们用边来表示每个数字呢?
小Ho:怎么用边表示数字?
小Hi:事实上也非常easy。比方说数字"10011",分别删掉它第一个数字和最后一个数字。得到"1001","0011"。然后我们连接一条从"1001"到"0011"的有向边。表示数字"10011"。则我们能够得到构图的方法:
对于N。我们构造一个包括2^(N-1)个点和2^N条边的图。点的编号从0到2^(N-1)-1。编号为i的点表示数字i。对于随意两个点,假设点i,点j满足点i的后n-2个数字和点j的前n-2个数字同样,则我们连接有向边(i,j)。而边(i,j)表示了数字((i << 1)+(j & 1))。比方对于N=3的时候,我们能够得到:

能够非常easy证明对于随意不同边(i,j),其表示的数字一定不同。
小Ho:这样构图话。仅仅要找到一条欧拉回路就能够了。可是一定会有欧拉回路么?
小Hi:当然能了。对于有向图,其存在欧拉路的条件是,至多有两个点的入度不等于出度。且这两个点满足:当中一个点入度比出度多1,还有一个点出度比入度多1。
若全部点的入度都等于出度。则一定存在欧拉回路。这能够通过和无向图欧拉路相同的方法进行构造证明。
而我们构造的图。由构造方法能够知道对于随意一个点。其入度一定为2,出度一定为2。
所以它必然存在欧拉回路。
在有向图中找欧拉路的方法,也仍然能够使用Fleury算法。写成伪代码的话:
DFS(u):
While (以u为起点。且未被删除的边e(u,v))
删除边e(u,v)
DFS(v)
End
PathSize ← PathSize + 1
Path[ PathSize ] ← u
可是。有一点要注意。在使用Fleury算法计算有向图的欧拉路时。我们须要将path[]倒序输出才干得到正确的路径。
小Ho:那找到欧拉回路之后呢?
小Hi:找到欧拉回路之后仅仅要对该条欧拉回路进行拼接就能够得到我们目标的圆盘状态了。
小Ho:好。我大概明确了。我这就来试试!
题目分析:
提示中说的非常清楚: 好好看看上面的解说。 非常聪明的地方是把图一变成了图二(图二也就是用边表示n位二进制能够表示的全部数。
n=3时, 是0~7),节省了空间。
假设存在一个欧拉回路, 也就是存在一条路径每条边都走过而且仅仅走一遍。 最后回到原点, 那么就能够说这个转盘能够表示n位二进制能够表示的全部数。用fleury求路径。 边球路径边记录,fleury不明确点这里。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std; int n, top, key, final[40000], ans[40000];
vector<int> vec[17000]; void init()//初始化把全部边标记出来
{
for(int i = 0; i < (1 << n - 1); i++)
{
int j = i << 1; // 点i向左移一位
int t = 1 << (n - 1);
j = j & (t - 1);//舍去第一位
vec[i].push_back(j); //最后一位加0
vec[i].push_back(j+1); //最后一位添1
}
}
void dfs(int x)
{
ans[++top] = x;
if(vec[x].size() > 0)
{
int tmp = vec[x][0];
vec[x].erase(vec[x].begin()+0);//要记得删除便利过的点
dfs(tmp);
}
}
void fleury(int x)
{
top = 1;
ans[top] = x;
while(top > 0)
{
if(vec[ans[top]].size() > 0)//假设可扩展。 则dfs可扩展的哪条路线
{
top--;
dfs(ans[top+1]);
}
else//该点x没有其它的边能够先走了(即不可扩展), 那么就用final记录下来
{
final[++key] = ans[top];
//ans仅仅是记录路径的中间记录, 可能会变, 一定要用final做最后的记录
top--;
}
}
}
int main()
{
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < (1 << n); i++) vec[i].clear();
init();
key = 0;
fleury(0);
for(int i = 1; i <= (1 << n); i++)//将路径的每一个值的最后一个二进制的值求出就可以
{
int tmp = final[i] & 1;
printf("%d", tmp);
}
cout << endl;
}
return 0;
}
hiho 1182 : 欧拉路·三的更多相关文章
- hiho 1182 : 欧拉路·三
1182 : 欧拉路·三 这时题目中给的提示: 小Ho:是这样的,每次转动一个区域不是相当于原来数字去掉最左边一位,并在最后加上1或者0么. 于是我考虑对于"XYYY",它转动之后 ...
- hihoCoder #1182 欧拉路·三 (变形)
题意: 写出一个环,环上有2^n个格子,每个格子中的数字是0或1,相连着的n个格子可以组成一个数的二进制,要求给出这2^n个数字的序列,使得组成的2^n个数字全是不同的.(即从0到2^n-1) 思路: ...
- hiho一下 第四十九周 欧拉路·一
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho近期在玩一个解密类的游戏.他们须要控制角色在一片原始丛林里面探险 ...
- hiho欧拉路·二 --------- Fleury算法求欧拉路径
hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇 ...
- hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】
题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...
- hiho一下 第四十九周 欧拉路
http://hihocoder.com/contest/hiho49/problem/1 给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 一个无向图存在欧拉路当且仅当 ...
- hiho48 : 欧拉路·一
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的 ...
- 牛客练习赛40 C 小A与欧拉路(树的直径)
链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...
- [hihoCoder] 第四十九周: 欧拉路·一
题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...
随机推荐
- phpMyAdmin出现找不到mysql扩展和Cannot log in to the MySQL server问题
环境:Centos6.5,Apache2.4, PHP5.5, MySql5.6. phpMyAdmin版本:https://files.phpmyadmin.net/phpMyAdmin/4.4.1 ...
- Android studio 导入PullToRefresh
1.新建一个Android项目,下载好Android-PullToRefresh-master,并解压,找到library文件夹,我把他放在C:\import目录下,下面的都是根据箭头一步一步的点击即 ...
- Python正则表达式初识(三)
前几天给大家分享了Python正则表达式基础(一)和Python正则表达式基础(二),感兴趣的小伙伴可以点击进去学习,今天继续给大家分享Python正则表达式基础. 1.正则表达式特殊字符“+”,其代 ...
- linux sed命令详解 --大量举例
1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ...
- 【Linux下权限控制之chmod与chown命令】
chmod 用于配置文件/目录权限 命名格式:chmod [选项] 文件/目录名 . 权限类别: r 读取 可用数字4表示 w 写入 可用数字2表示 x 执行 可用数字1表示 . 归属类别: u 属主 ...
- 【Django】视图系统
目录 FBV 与 CBV 给视图加装饰器 使用装饰器装饰CBV 关于dispatch()方法 Request对象 与 Response对象 request对象 response对象 @ *** 一个视 ...
- chown---改变某个文件或目录的所有者和所属的组
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用户或者是用户D,用户组可以是组名或组id.文件名可以使由空格 ...
- leetcode第一刷_Scramble String
字符串的好题. 题干解释的很复杂.一下让人不知所措了. 这道题究竟是什么意思呢?终于的结果是把一个字符串中字母的顺序打乱了,让你推断一个字符串能不能由还有一个字符串打乱得到.那打乱这个过程是怎么做的呢 ...
- 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)
iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...
- RvmTranslator6.0 - Dassault Systemes 3DXML
RvmTranslator6.0 - Dassault Systemes 3DXML eryar@163.com 1. Introduction RvmTranslator can translate ...