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条边 两个相 ...
随机推荐
- 【HEVC帧间预测论文】P1.5 Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule
Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule <HEVC标准介绍.HEVC帧间预测论文笔记&g ...
- Windows Server 启用匿名共享
1.开始 → 运行 → gpedit.msc,打开组策略编辑器: 2.依次展开"计算机配置" → "windows设置" → "安全设置" ...
- SQLite – DISTINCT 关键字
SQLite – DISTINCT关键字 使用SQLite DISTINCT关键字与SELECT语句来消除所有重复的记录和获取唯一的记录. 可能存在一种情况,当你有多个表中重复的记录. 获取这些记录, ...
- VINS-Fusion代码阅读(四)
pts_i和pts_j:具体指什么含义?(分别为第l个路标点在第i, j个相机归一化相机坐标系中的观察到的坐标,P¯¯¯cil \bar{P}^{c_i}_l Pˉ lc i 和 P¯¯¯cjl ...
- html5shiv.js让吃屎的IE6、IE7、IE8支持html5去吧
插件介绍 用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题.所以我们在使用过程中,想要让低版本的浏览器,即IE9以下的浏览器支持,那么这款html5shiv.js是一 ...
- this.$Message.success('提示信息') 少写了一个c 导致报错
this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可
- Python基础2 列表 元祖 字符串 字典 集合 文件操作 -DAY2
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- 字符串类型:str, bytes 的区别
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分. 文本总是 Unicode,由 str 类型表示, 二进制数据则由 bytes 类型表示. Python 3不会以任意隐式的方 ...
- PHP22 PHP在线支付
易宝支付示例脚本 参考网址:https://blog.csdn.net/yerenyuan_pku/article/details/52239862 参数说明 p1_MerId:商户编号,网站在易宝上 ...
- 最小生成树 Prim算法 Kruskal算法实现
最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...