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条边 两个相 ...
随机推荐
- (2)Ngixn 编译安装设置开机自启
设置nginx开机自启 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 ...
- (转)SpringMVC学习(八)——SpringMVC中的异常处理器
http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...
- python3.7 socket通信
def OpenClient(self,e): global line line = socket.socket(socket.AF_INET,socket.SOCK_STREAM) line.bin ...
- vueCode 常用代码总结 20190116
<template>props 传参<in-body :mbx="['首页','','']"> props 代码使用<BreadcrumbItem&g ...
- Android Studio中删除无效的字符串资源
1.定位到当前项目中的strings.xml文件 1.菜单栏找到"Analyze"->"Run Inspection By Name..."->输入 ...
- Python3使用PyMySQL操作数据库
1. 安装PyMySQL pip install PyMySQL 关于PyMySQL的详细内容可以查看官方文档 Github 2. 创建表 在某个数据库内,使用以下指令建表 CREATE TABLE ...
- Centos 7 编译php 7.2.10
步骤一:安装依赖 yum install -y wget gcc gcc-c++ gd-devel zlib-devel libjpeg-devel libpng-devel libiconv-dev ...
- Vmare虚拟机中的3种网络连接方式
安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和VMnet8,其他的未安装(当然也可以手动安装其他的). 其中: VMnet1是host网卡,用于host方式连接网络的. VMnet8是NAT网 ...
- vue 指令---气泡提示(手撸实战)
菜鸟学习之路//L6zt github 自己在造组件轮子,也就是瞎搞.自己写了个slider组件,想加个气泡提示.为了复用和省事特此写了个指令来解决.预览地址项目地址 github 我叫给它胡博 cs ...
- CSS--基础块级元素与内联元素
在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素.在HTML和XHTML中,块级元素不能继承自行内元素(即不能嵌套在行内元素),<p&g ...