题意:

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 【手工递归】【欧拉回路】的更多相关文章

  1. POJ 1780 Code(欧拉回路+非递归dfs)

    http://poj.org/problem?id=1780 题意:有个保险箱子是n位数字编码,当正确输入最后一位编码后就会打开(即输入任意多的数字只有最后n位数字有效)……要选择一个好的数字序列,最 ...

  2. poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串

    两道题目意思差不多 第一题是10进制 , 第二题是2进制的 都是利用欧拉回路的fleury算法来解决 因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中 ...

  3. [欧拉回路+手动开栈] poj 1780 Code

    题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  4. poj 1300 Door Man 欧拉回路

    题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many ro ...

  5. POJ 2230 Watchcow(欧拉回路:输出点路径)

    题目链接:http://poj.org/problem?id=2230 题目大意:给你n个点m条边,Bessie希望能走过每条边两次,且两次的方向相反,让你输出以点的形式输出路径. 解题思路:其实就是 ...

  6. poj 2337 && zoj 1919 欧拉回路+连通性判断

    题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(con ...

  7. poj 2083 Fractal 递归 图形打印

    题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X  X        X               ...

  8. poj 1780 Code

    //题目描述:KEY公司开发出一种新的保险箱.要打开保险箱,不需要钥匙,但需要输入一个正确的.由n位数字组成的编码.这种保险箱有几种类型,从给小孩子玩的玩具(2位数字编码)到军用型的保险箱(6位数字编 ...

  9. poj 1780 code(欧拉路)

    /* 对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着 就是说 前一个的后n-1位是后一个的前n-1位 假设n==3 我们用0-99作为点的编号建图 然后每个点连出去10条边 两个相 ...

随机推荐

  1. Runtime理解

    动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...

  2. mysql 表锁死的问题

    select * from information_schema.innodb_trx; kill 34863;kill 34856;kill 34860;kill 34859;kill 34845; ...

  3. dropuser - 删除一个 PostgreSQL 用户帐户

    SYNOPSIS dropuser [ option...] [ username] DESCRIPTION 描述 dropuser 删除一个现有 PostgreSQL 用户 和 该用户所有的数据库. ...

  4. ES6 export default 和 export 的区别

    export default 和 export 区别: 1.export与export default均可用于导出常量.函数.文件.模块等 2.你可以在其它文件或模块中通过import+(常量 | 函 ...

  5. SQL使用exists时的多种写法

    from test; go from test; go 下面这种效率明显高不少.

  6. java读取nc文件的问题,前端ajax 发送参数进行交互的实例

    1.问题背景: 需要解析nc文件的数据源,获取一个三维数据,并计算器开发值. java 后台处理: 定以一个实例来接收解析的数据并返回给前端. package cn.edu.shou.domain; ...

  7. Hash冲突的几种解决方法

    1. 开放定值法: 也叫再散列法,当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突 ...

  8. PyQt5-Python3-PyCharm 配置

    File->Tools->External Tools->add 配置ui文件转换工具 Name: PyUIC Program: D:\develop\python\Mac\venv ...

  9. python3.6以上 asyncio模块的异步编程模型 async await语法

    这是python3.6以上版本的用法,本例是python3.7.2编写使用asyncio模块的异步编程模型,生产这消费者,异步生产,用sleep来代替IO等待使用async和await语法来进行描述a ...

  10. MySQL数据类型与操作

    内容提要: 建表完整语法规范(create table 表格(字段名1 类型 (宽度) 约束条件)) MySQL数据库数据类型(整型.浮点型.字符类型(char与varchar).日期类型.枚举与集合 ...