poj 1780 Code
//题目描述:
KEY公司开发出一种新的保险箱。要打开保险箱,不需要钥匙,但需要输入一个正确的、由
n位数字组成的编码。这种保险箱有几种类型,从给小孩子玩的玩具(2位数字编码)到军用型的
保险箱(6位数字编码)。
当正确地输入最后一位编码后,保险箱就立刻打开了。保险箱上没有“确定”键。当你输入
超过n位数字,则只有最后n位数字有效。例如,对一种4位数字编码的型号,如果正确的编码
为4567,你想输入的编码为1234567890,则保险箱的门会在你输入数字7后马上就打开了。
为了达到这种效果所需要设计的软件其实很简单。对n位数字编码的型号,保险箱始终处于
10
(n-1)
种内部状态之一。保险箱的当前状态只需用最后输入的n-1位数字表示,其中有一种状态(例
如,对前面的例子,就是456)被记为“开锁状态”。如果保险箱处于“开锁状态”,且输入最后
一位正确的数字(例如,在上面的例子中就是7),保险箱的门就打开了;否则保险箱切换到对应
的新状态。例如,如果保险箱的当前状态为456,接着输入8,则保险箱的状态切换到568。
为了开保险箱,一个繁琐的策略是一位接一位地输入所有可能的编码。然而,在最坏情况下,
这需要按键n×10
n次(有10
n组可能的编码,每个编码有n位)。而选择一个好的数字序列,最
多只需要按键10
n
+ n - 1次就可以打开保险箱了:你需要做的就是找到一个数字序列包含所有的
n位数一次且仅一次。KEY公司宣称,对军用型号(n = 6),当今最快的计算机也需要数十亿年
的时间才能找到这样的数字序列,但是很显然他们不知道有些程序员能在几分钟就能找到这样的
数字序列。 // 求序列的方法为:对于当前长度为n-1的序列, 其后添加一个数字, 使得添加后的序列没有
// 在前面出现过
// 我先用递归写了下 然后改成栈模拟 不然直接来还真是不好写
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 1000100
int ls[maxn/];
int ans[maxn],st[maxn];
int s,a;
/*int cnt;用递归会爆的、、、
void dfs(int n,int m,int dp){
int v,u=n%m;
dp++;
while(ls[u]<10){
v=u*10+ls[u];
ls[u]++;
dfs(v,m,dp);
ans[cnt++]=v%10;
u=v%m;if(ls[u]>=10) u=v/10;
}
printf("dp=%d\n",dp);
}*/
// 对于当前长度为n-1的序列, 其后添加一个数字, 使得添加后的序列没有在前面出现过
void search(int v,int m){
int w;
while(ls[v]<){
w=v*+ls[v];ls[v]++;
st[s++]=w;
v=w%m;
}
}
int main(){
int n,m;
int i;
while(scanf("%d",&n),n){
for(m=,i=;i<n;i++)
m=m*;
for(i=;i<=m;i++)
ls[i]=;
s=a=;
search(,m);
// cnt=0;
// dfs(0,m,0);
// printf("\n");
int v;
while(s){
v=st[--s];
ans[a++]=v%;
v=v/;
search(v,m);
}
for(i=;i<n;i++)
printf("");
for(i=a-;i>=;i--)
printf("%d",ans[i]);
printf("\n");
} return ;
}
poj 1780 Code的更多相关文章
- [欧拉回路+手动开栈] poj 1780 Code
题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- POJ 1780 Code(欧拉回路+非递归dfs)
http://poj.org/problem?id=1780 题意:有个保险箱子是n位数字编码,当正确输入最后一位编码后就会打开(即输入任意多的数字只有最后n位数字有效)……要选择一个好的数字序列,最 ...
- poj 1780 code(欧拉路)
/* 对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着 就是说 前一个的后n-1位是后一个的前n-1位 假设n==3 我们用0-99作为点的编号建图 然后每个点连出去10条边 两个相 ...
- POJ 1780 Code(有向图的欧拉通路)
输入n(1<=n<=6),输出长度为10^n + n -1 的字符串答案. 其中,字符串以每n个为一组,使得所有组都互不相同,且输出的字符串要求字典序最小. 显然a[01...(n-1)] ...
- poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串
两道题目意思差不多 第一题是10进制 , 第二题是2进制的 都是利用欧拉回路的fleury算法来解决 因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中 ...
- Code POJ - 1780(栈模拟dfs)
题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...
- POJ 1850 Code
组合数学.... Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7202 Accepted: 3361 Descrip ...
- POJ Sky Code 莫比乌斯反演
N. Sky Code Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO for ...
- poj 2567 Code the Tree 河南第七届省赛
Code the Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2350 Accepted: 906 Desc ...
随机推荐
- BestCoder Round #2
TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883 竟然暴力1.44*10^7 还要*T=100 竟然过了 # ...
- [转载]C# Double toString保留小数点方法
有时候double型数据需要toString(),但又想保留小数,当值为整数,比如3.00时tostring后会变为”3″,具体说明见下: 1 string str0 = i.ToString(&qu ...
- 【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn
落雨 如果你想连接远程IP的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL ...
- uva 11627
二分 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #inc ...
- log4j 总结 精华
去年这个时候,为做软件工程的大作业就详细学过Log4J的用法了,时隔一年想要在新的项目中好好使用一下的时候,发现几乎全忘了,悲催啊…… 再上网查资料,总是不能找到一篇符合我的口味,拿来就能轻松上手,方 ...
- 140304笔记, mysql 更改自动增长字段值的重新设定
1. 存在同名的或不同的namespace交错情况. Caused by: com.ibatis.sqlmap.client.SqlMapException: There is no result m ...
- netbeans 7安装xdebug调试php程序
1.下载安装xdebug 先从xdebug官网下载对应php版本的xdebug组件,下载地址是:http://www.xdebug.org/download.php 如果不确定下载哪个版本的xdebu ...
- winform Chart控件 获取鼠标处坐标值方法
Chart控件本身功能强大,应用广泛,因此其属性.方法也很多.此处介绍在很多应用中需要查看鼠标位置处坐标值的一些方法 1,调用Chart事件 GetToolTip 利用ToolTipEventArg ...
- String.IsNullOrEmpty()和String.IsNullOrWhiteSpace()
转自:http://hi.baidu.com/saclrpqmttbntyq/item/4592fc72c5a19e5c0d0a07eb 由于总用 String.IsNullOrEmpty( s ) ...
- lintcode:Compare Strings 比较字符串
题目: 比较字符串 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 样例 给出 A = "ABCD" B = "ACD" ...