题目链接

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. Linux iptables:场景实战一

    <Linux iptables:规则原理和基础>和<Linux iptables:规则组成>介绍了iptables的基础及iptables规则的组成,本篇通过实际操作进行ipt ...

  2. 「Django」rest_framework学习系列-用户认证

    用户认证:1.项目下utils文件写auth.py文件 from rest_framework import exceptions from api import models from rest_f ...

  3. pthread在Qt+Windows下的使用

    pthread是牛逼的跨平台线程库,无需多介绍. 下载pthread-win32,解压后将x86里的pthreadVC2.dll放到system32目录里,将pthreadVC2.lib放入项目中去, ...

  4. Eclipse中 如何实现 多行同时编辑

    在编辑的时候按下 SHIFT + ALT +A 之后  鼠标变为 + 号   选择要同时编辑几行  即可编辑(现在eclipse好像只能是编辑一块地方  不能像vs那样 任何地方可以同时编辑  这点很 ...

  5. 【机器学习】K-邻近算法的python 实现

    #!/usr/bin/python # -*- coding: utf-8 -*- from numpy import * import operator def createDataSet(): ' ...

  6. NYOJ 409 郁闷的C小加(三) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...

  7. python模块之imghdr检测图片类型

    1. imghdr是什么 imghdr是一个用来检测图片类型的模块,传递给它的可以是一个文件对象,也可以是一个字节流. 能够支持的图片格式: 2. 如何使用 提供了一个api叫做imghdr.what ...

  8. XML-RPC笔记

    1.什么是XML-RPC RPC(Remote Procedure Call)就是相当于提供了一种"远程接口"来供外部系统调用,常用于不同平台.不同架构的系统之间互相调用. XML ...

  9. 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(4)

    我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...

  10. 自动化测试===adb 解锁手机的思路

    在adb里有模拟按键/输入的命令 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列 ...