POJ 1780 【手工递归】【欧拉回路】
题意:
1.提供密码的位数。
2.密码的输入可以一直保持,取后n位作为密码。如果密码正确则开锁。
3.设计一种方法使得在输入最少的情况下破译。(即保证每个密码只输入一次)
4.输出输入的数字的序列。
思路:
去密码的前n-1位作为状态节点,将n位数密码作为边。建造有向图。
显然,每个点的入度和出度都为10,则一定存在欧拉回路。
利用简单DFS寻找欧拉回路。
(这题好像是要求输出字典序最小的序列)
DFS应该不难写,但是这题如果直接递归会爆栈。所以需要手工用栈模拟递归的过程...
屌丝看了大神的关于递归定义的博客才对递归有了更深刻的理解...
博客地址:http://www.tuicool.com/articles/BrIVz2
==以前lz只是把递归当作快速插入代码的东西来用==
代码:
#include<stdio.h>
#include<string.h>
int n,e,tmpe,s;
bool out[][];
int road[];
int mypos[];
int pos[];
void solve()
{
int load=;
bool needop=;
int tmpn=;
memset(out,,sizeof(out));
memset(mypos,,sizeof(mypos));
pos[]=;
s=;
e=;
tmpe=;
for(int i=; i<=n; i++)
{
e*=;
}
tmpe=e/;
while(s)
{
if(load==)
{
mypos[s]=;
load=;
continue;
}
else if(load==-)
{
out[pos[s]][mypos[s]-]=;
load=;
continue;
}
else
{
if(mypos[s]==)
{
s--;
load=-;
continue;
}
else if(!out[pos[s]][mypos[s]])
{
mypos[s]++;
load=;
continue;
}
else
{
load=;
int tmp=(pos[s]-pos[s]/tmpe*tmpe)*+mypos[s];
road[s]=pos[s]*+mypos[s];
out[pos[s]][mypos[s]]=;
mypos[s]++;
s++;
pos[s]=tmp;
}
}
if(s>e)
break;
}
for(int i=;i<n;i++)
printf("");
for(int i=;i<=e;i++)
{
printf("%d",road[i]%);
}
printf("\n");
}
int main()
{
scanf("%d",&n);
while(n)
{
if(n==)
printf("0123456789\n");
else
solve();
scanf("%d",&n);
}
}
下面是直接递归的代码:
#include<stdio.h>
#include<string.h>
int n,e,tmpe;
bool out[][];
bool in[][];
bool vis[];
int road[];
int num;
bool dfs(int pos,int nn)
{
if(nn==e-)
return ;
for(int i=;i<;i++)
{
if(out[pos][i])
{
out[pos][i]=;
int tmp=(pos-pos/tmpe*tmpe)*+i;
road[nn]=pos*+i;
if(dfs(tmp,nn+))
return ;
out[pos][i]=;
}
}
return ;
}
void solve()
{
memset(in,,sizeof(in));
memset(out,,sizeof(out));
memset(vis,,sizeof(vis));
e=;
tmpe=;
for(int i=;i<=n;i++)
{
e*=;
}
tmpe=e/;
dfs(,);
for(int i=;i<e-;i++)
{
printf("%d\n",road[i]);
}
}
int main()
{
scanf("%d",&n);
while(n)
{
if(n==)
printf("0123456789\n");
else
solve();
scanf("%d",&n);
}
}
POJ 1780 【手工递归】【欧拉回路】的更多相关文章
- POJ 1780 Code(欧拉回路+非递归dfs)
http://poj.org/problem?id=1780 题意:有个保险箱子是n位数字编码,当正确输入最后一位编码后就会打开(即输入任意多的数字只有最后n位数字有效)……要选择一个好的数字序列,最 ...
- poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串
两道题目意思差不多 第一题是10进制 , 第二题是2进制的 都是利用欧拉回路的fleury算法来解决 因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中 ...
- [欧拉回路+手动开栈] poj 1780 Code
题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- poj 1300 Door Man 欧拉回路
题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many ro ...
- POJ 2230 Watchcow(欧拉回路:输出点路径)
题目链接:http://poj.org/problem?id=2230 题目大意:给你n个点m条边,Bessie希望能走过每条边两次,且两次的方向相反,让你输出以点的形式输出路径. 解题思路:其实就是 ...
- poj 2337 && zoj 1919 欧拉回路+连通性判断
题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(con ...
- poj 2083 Fractal 递归 图形打印
题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X X X ...
- poj 1780 Code
//题目描述:KEY公司开发出一种新的保险箱.要打开保险箱,不需要钥匙,但需要输入一个正确的.由n位数字组成的编码.这种保险箱有几种类型,从给小孩子玩的玩具(2位数字编码)到军用型的保险箱(6位数字编 ...
- poj 1780 code(欧拉路)
/* 对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着 就是说 前一个的后n-1位是后一个的前n-1位 假设n==3 我们用0-99作为点的编号建图 然后每个点连出去10条边 两个相 ...
随机推荐
- 64位系统上32位进程拷贝文件到System32目录时的重定向
64位系统上,32位进程拷贝文件到"System32"目录时,会被文件系统重定向到"SysWOW64"目录 要禁用这种重定向,需要用到下面2个API: Wow6 ...
- SQL——将两列合并成一列
将两列合并连接成一列,需要注意的是列的格式必须是NVARCHAR或者VARCHAR类型 ), call_uuid, ) +','+agent_code ' PerDate 1 ,980408102 ...
- OpenJudge_2757:最长上升子序列
描述一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1 ...
- 解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号
解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号 在设置中把"vetur.format.defaultFormatter.js": " ...
- docker 容器的网络
容器的网络模式 bridge -net=bridge 默认网络.docker启动后创建一个docker0网桥,默认创建的容器也添加到这个网桥 [root@localhost ~]# ip a 1: l ...
- linux_2
mac和linux上默认安装着SSH客户端,Windows上需要自己安装个软件. Windows下SSH客户端的安装:建议从官方网站下载正式程序安装(免费) Putty:https://www.chi ...
- 题目:企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成 3%; 60万到100万之间时,高于60万元的部分,可提成1.5%; 高于100万元时,超过
题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%: 20万到 ...
- ideal取消按下两次shift弹出搜索框 修改idea,webstrom,phpstrom 快捷键double shift 弹出search everywhere
因为经常需要在中英文之间切换,所以时常使用shift键,一不小心就把这个Searchwhere 对话框调出来了,很是麻烦. 因此痛定思痛, 我决定将这个按两下shift键就弹出搜索框的快捷键禁用了! ...
- HDU6199 gems gems gems (DP)
题意:有n颗石子 两个人轮流拿 如果上一个人拿了x颗 这个人就可以拿x或x+1颗 问先手能获得与后手的价值差最大是多少 题解:看起来是博弈 其实是DP dp[i][j][0/1]表示当前该0/1拿 拿 ...
- No-3.Linux 终端命令格式
Linux 终端命令格式 01. 终端命令格式 command [-options] [parameter] 说明: command:命令名,相应功能的英文单词或单词的缩写 [-options]:选项 ...