hdoj 1226 超级密码 【隐式图BFS】

题目:hdoj 1226 超级密码

分析:这题属于隐式图搜索,状态不是很明显,需要自己建立。

其实搜索说白了就是暴力。

这个题目就是,首先对给出的可以组成的所有的数依次枚举,长度从小到大。

比如第一组样例,因为0不能出现在首位,那么我们枚举首位为1 和 7 看看漫步满足,

满足的话枚举第二位10 11 17 以及 70 71 77 顺便保存他们取余 n 之后的值,这样就可以剪枝,搜索过的就不用重复搜索了。

要求最早出现的BFS即可,第一个搜到的就是。

注意长度不大于500

AC代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 15;
int a[20];
int flag[60000];
struct Node
{
    string s;
    int ss;
};
Node ans;
int n,c,m;
char solve(int x)
{
    if(x>=0 && x<=9)
        return x+'0';
    return x-10+'A';
}
bool BFS()
{
    memset(flag,0,sizeof(flag));
    queue<Node> q;
    Node now,next;
    for(int i=0;i<m;i++)
    {
        if(a[i]!=0)
        {
            now.s = solve(a[i]);
            now.ss = (a[i]%n);
            if(now.ss == 0)
            {
                ans = now;
                return true;
            }
            if(flag[now.ss]==0)
            {
                flag[now.ss] = 1;
                q.push(now);
            }
        }
    }
    while(!q.empty())
    {
        now = q.front();
        q.pop();
        //cout<<now.s<<" "<<now.ss<<endl;
        if(now.ss == 0)
        {
            ans = now;
            return true;
        }
        for(int i=0;i<m;i++)
        {
            next.s= now.s+solve(a[i]);
            next.ss = (now.ss*c+a[i])%n;
           // cout<<"NEXT:"<<next.s<<" "<<next.ss<<" "<<a[i]<<endl;
            if(flag[next.ss]==0)
            {
                flag[next.ss] = 1;
                q.push(next);
            }
        }
    }
    return false;
}
int main()
{
    //freopen("Input.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&c,&m);
        for(int i=0;i<m;i++)
        {
            char c[10];
            scanf("%s",c);
            if(c[0]>='A' && c[0]<='F')
                a[i] = (c[0]-'A')+10;
            else
                a[i] = c[0]-'0';
        }
        sort(a,a+m);
        if(n==0)
        {
            if(a[0]==0)
                puts("0");
            else
                puts("give me the bomb please");
            continue;
        }
        if(BFS() && ans.s.size()<=500)
            cout<<ans.s<<endl;
        else
            puts("give me the bomb please");
    }
    return 0;
}
时间: 2024-10-13 01:52:27

hdoj 1226 超级密码 【隐式图BFS】的相关文章

HDOJ 1226 超级密码(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. <1>搜索方式选择:由于密码的长度未知(题目限制最大为500),所以状态树的深度比较深,采用dfs搜索效率比较低,选择bfs搜索更好. <2>剪枝方法:题目中对于每个状态需要采用模运算判断是否为N的整数倍: 由模运算的性质:设存在两个整数a和b,如果a%n==b%n,那么(a*x+c)%

2014牡丹江网络预选赛F题(隐式图BFS暴搜)zoj3814

Sawtooth Puzzle Time Limit: 10 Seconds      Memory Limit: 65536 KB Recently, you found an interesting game called Sawtooth Puzzle. This is a single-player game played on a grid with 3 x 3 cells. Each cell contains a part of an image. Besides, each ed

八数码问题+路径寻找问题+bfs(隐式图的判重操作)

Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 process()  初始化vis数组,初始化初始节点到目标节点的移动距离 dfs()搜索到每一个节点,如果不是目标节点,对其依次扩展所有子节点,并判重,全部子节点搜索完全后,改变父节点:如果是目标节点成功返回 输出最少移动步数 input: 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6

隐式图的遍历

好久不看都快忘了... 一些奇怪的问题可以归为隐式图的遍历 NEUOJ544 Problem Description there is an old saying,"You can not do anything without water"or"Water is the source of life". Besides, human beings are made of water. Sister Wang thinks that woman is made of

hdu1818 It&#39;s not a Bug, It&#39;s a Feature!(隐式图最短路径Dijkstra)

题目链接:点击打开链接 题目描述:补丁在修bug时,有时也会引入新的bug,假设有n(n<=20)个潜在的bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug.第一个串表示打补丁之前的状态('-'表示在该位置不存在bug,'+'表示该位置必须存在bug,0表示无所谓),第二个串表示打补丁之后的状态('-'表示不存在,'+'表示存在,0表示不变).每个补丁都有一个执行时间,你的任务是用最少的时间把一个所有bug都存在的软件通过打补丁的方式变得没

It&amp;#39;s not a Bug, It&amp;#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)

Language: Default It's not a Bug, It's a Feature! Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 1353   Accepted: 516 Description It is a curious fact that consumers buying a new software product generally do not expect the software to

【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 << pos)); 将s中二进制第k位变成1的处理方式: s = s | (1 << pos); 2.二进制运算: [1] & : 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0; 快速判断奇偶性: if(a & 1);//为奇数

uva658(最短路径+隐式图+状态压缩)

题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100) 个补丁,每个补丁用两个长度为 n 的字符串表示,其中字符串的每个位置表示一个 bug.第一 个串表示打补丁之前的状态("-" 表示该 bug 必须不存在,"+" 表示必须存在,0 表示无所 谓),第二个串表示打补丁之后的状态("-" 表示不存在,

hdu 1226 超级密码 BFS 挺不错的题啊!

超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2883    Accepted Submission(s): 928 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制的