题目链接

http://poj.org/problem?id=2956

题意

如果一个数中的每一位都是不同的,那么这个数叫做无重复数,如11是有重复数,12是无重复数。输入正整数n(1<=n<=1000000),输出第n个无重复数。

思路

可以使用两种方法来解决本题:枚举和bfs。

方法一:枚举

如果直接暴力枚举的话会超时,所以要考虑一些情况来减少枚举。比如对于一个数128267来讲,它的第2位(从右往左数)和第4位是相同的,则形如1282**的数都不用枚举了,直接从128300枚举即可,这样可加快枚举的时间。

枚举代码:

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
int ans[N+] = {};
int power[] = {, , , , , , , , }; void init()
{
int d[]; //存储数字x
int v[]; //v[i]表示数字i是否在x中出现过
int cur = ;
int x, y=;
while(cur<=N)
{
x = y;
memset(v, -, sizeof(v));
memset(d, , sizeof(d)); int i, j;
for(i=; x!=; i++)
{
d[i] = x % ;
if(v[d[i]]!=-)
break;
v[d[i]] = i;
x /= ;
}
if(!x)
{
ans[cur++] = y;
y++;
}
else
{
j = v[d[i]];
for(i--; i>=j; i--)
x = x*+d[i];
x++;
y = x*power[j];
}
}
} int main()
{
init();
int n;
while(cin>>n && n)
cout<<ans[n]<<endl;
return ;
}

方法二:BFS

bfs的初始状态为1~9,在初始状态的后面不断地添加0~9可以得到下一层状态,在对第二层状态不断地进行扩展,知道扩展到第1000000个状态为止。每一个状态包含两个属性value和digit,value为状态的值,假设为134,则digit为11010,d[i]=1表示i在value中,在数字134后添加0~9中的数字时(假设添加的数字为1),如何判断1是否在134中出现过呢,value=1,则digit = 10 ,将11010与10做与操作即11010&10,若结果不等于0,这说明1在134中存在,否则不存在。

BFS代码

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
struct Number
{
int value; //数字的十进制表示
int digit; //二进制序列,从右往左数digit[i]==1表示value中有i Number(){}
Number(int v, int d):value(v), digit(d){}
}ans[N+]; int main()
{
for(int i=; i<; i++)
ans[i] = Number(i, <<i); int k = ;
for(int cur=; cur<=N; k++)
{
int v = ans[k].value;
int d = ans[k].digit; for(int i=; i<; i++)
{
if( !(d & (<<i)))
ans[cur++] = Number(v*+i, d|<<i);
}
} int n;
while(scanf("%d", &n)== && n)
printf("%d\n", ans[n].value);
return ;
}

一点总结

如何判断数a和数b中是否存在相同的数字呢?

一种做法是将数a和数b的每一位分别分解到数组A[]和数组B[]中,然后遍历数组A[]、B[],试着找出相同的位。

第二种做法是用A[i]=1表示i存在a中,A[i]=0,表示a中没有i,则对处理后的A[]和B[]进行与(&)操作,结果为0说明a,b中没有相同的位,结果为1则说明a,b中有相同的位。在上面的bfs中,如果每一个状态都存储一个数组的话,会消耗大量内存,所以可以将数组中的二进制序列转化成一个十进制整数,通过左移i位来表示数字中包含i。

参考

http://www.acmsearch.com/article/show/24772

poj2956 Repeatless Numbers(枚举|BFS)的更多相关文章

  1. Repeatless Numbers[POJ2956]

    Repeatless Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1719   Accepted: 726 ...

  2. 【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 Flow Free is a puzzle that is played on a 2D grid of cells, with some ...

  3. poj 2965 The Pilots Brothers' refrigerator枚举(bfs+位运算)

    //题目:http://poj.org/problem?id=2965//题意:电冰箱有16个把手,每个把手两种状态(开‘-’或关‘+’),只有在所有把手都打开时,门才开,输入数据是个4*4的矩阵,因 ...

  4. 蓝桥杯 剪邮票(dfs枚举 + bfs)

    剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...

  5. POJ 2965 The Pilots Brothers' refrigerator (枚举+BFS+位压缩运算)

    http://poj.org/problem?id=2965 题意: 一个4*4的矩形,有'+'和'-'两种符号,每次可以转换一个坐标的符号,同时该列和该行上的其他符号也要随之改变.最少需要几次才能全 ...

  6. 洛谷P2622 关灯问题II (二进制枚举+bfs

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  7. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  8. Asia Hong Kong Regional Contest 2016

    A. Colourful Graph 可以在$2n$步之内实现交换任意两个点的颜色,然后就可以构造出方案. #include <bits/stdc++.h> using namespace ...

  9. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

随机推荐

  1. 轮廓问题/Outline Problem-->改进的算法及时间复杂度分析

    前面写过一篇关于轮廓算法的文章,是把合并建筑和合并轮廓是分开对待的,并且为了使轮廓合并的时候算法简单,对x坐标使用了double类型,然后对整形的x坐标数据进行合并.这样做是为了使得需找拐点的算法容易 ...

  2. python基础5--模块

    模块 一.模块简介 模块是一个包含有定义的函数和变量的文件,其后缀名是.py.Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持. 标准 ...

  3. socket--接受大数据

    一.简单ssh功能 1.1 实现功能 在前面的一篇博客中,我们已经实现了一个简单的类似Linux服务器ssh功能的小程序,可以输入系统命令来返回命令运行结果,今天我们也以此开始,看看socket如何来 ...

  4. 让块元素在同一行显示的方法: float 和inline-block

    float: 定义:按照一个指定的方向移动,遇到父级的边界或者相邻的浮动元素就会停下来(不完全脱离文档流) 值: left.right.none 特点: 1.浮动的块元素可以在一行显示,宽度是被内容撑 ...

  5. libuv移植到ios

    libuv官网只提供了os x的编译方法,没有IOS的.既然os x和ios的系统内核差不多,并且编译工具都是xcode,那我们只要重新指定cpu架构,就可以编译出ios版的了. 1.安装python ...

  6. codeforces 876 C. Classroom Watch

    http://codeforces.com/contest/876/problem/C C. Classroom Watch time limit per test 1 second memory l ...

  7. 拓扑排序 最大字典序+优先队列 BZOJ 4010

    http://www.lydsy.com/JudgeOnline/problem.php?id=4010 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory ...

  8. Linux高级编程--03.make和makfile

    Makefile语法基础 在Linux下,自动化编译工具是通过make命令来完成的(一些工具厂商也提供了它们自己的make命令,如gmake等),make命令的基本格式如下: make [-f mak ...

  9. mysql 导出数据导致锁表

    故事原由:今天同事小星做系统优化时问我一个sql问题,为什么查询慢,我看了一眼,发现用到了表A中的datetime类型列进行时间比较,建议他给datetime类型列加上索引. 可这是生产库,表A里面有 ...

  10. 使用HTML5、CSS3和jQuery增强网站用户体验[留存]

    记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验?是不是立刻就想到了flash实现?这彷佛年代久远的事了.使用现在最流行的Web技术HTML5,CSS3和jQuery,同样也可以实现类 ...