题目链接: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)%n==(b*x+c)%n;

所以如果在搜索的过程出现了某个状态取模的余数与前面某个状态取模的余数相同的情况,那么这个状态被剪枝,不需要延伸下去;

<3>注意事项:对于判断某个数是否为N的倍数的方法中,因为密码的十进制数可能太大导致无法存储,需要借助模运算的性质:

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p) % p

(a * b) % p = ((a % p) * (b % p)) % p

(a ^ b) % p = ((a % p) ^ b) % p

代码如下:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int MAX_N = + ;
const int MAX_M = + ; struct Node
{
int num[MAX_N];
int len;
};
bool digit[];
bool mark[MAX_M];
int N, C, M; int Judge(Node &p)
{
int len = p.len;
int temp = ; for (int i = ; i <= len; ++i)
temp = (temp * C + p.num[i]) % N;
return temp;
} bool Bfs()
{
Node p;
queue<Node>Q; p.len = ;
Q.push(p);
while (!Q.empty())
{
p = Q.front();
Q.pop(); for (int i = (p.len == ? : ); i < ; ++i)
{
if (digit[i])
{
int mod = ;
Node q = p; q.num[q.len] = i;
mod = Judge(q); if (mod && !mark[mod] && q.len + <= )
{
mark[mod] = true;
q.len += ;
Q.push(q);
}
else if(mod == )
{
for (int i = ; i <= q.len; ++i)
printf("%X", q.num[i]);
printf("\n");
return true;
}
}
}
}
return false;
} int main()
{
int case_times; scanf("%d", &case_times);
while (case_times--)
{
int temp_value; scanf("%d%d%d", &N, &C, &M);
memset(digit, false, sizeof(digit));
memset(mark, false, sizeof(mark));
for (int i = ; i < M; ++i)
{
scanf("%x", &temp_value);
digit[temp_value] = true;
} if (N == && digit[])
printf("0\n");
else if (N == && !digit[])
printf("give me the bomb please\n");
else if (!Bfs())
printf("give me the bomb please\n");
} return ;
}

HDOJ 1226 超级密码(bfs)的更多相关文章

  1. hdu.1226.超级密码(bfs)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. HDOJ 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  3. HDU 1226 超级密码(BFS) (还需研究)

    Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Desc ...

  4. hdoj 1226 超级password 【隐图BFS】

    称号:hdoj 1226 超级password 分析:这题属于隐式图搜索,状态不是非常明显,须要自己建立. 事实上搜索说白了就是暴力. 这个题目就是,首先对给出的能够组成的全部的数依次枚举.长度从小到 ...

  5. HDU 1226 超级密码(数学 bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others)    ...

  6. 超级密码(bfs)

    超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  7. hdu 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  8. hdu_1226超级密码(BFS)

    超级密码 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密码是 ...

  9. hdu 1226 超级密码(bfs+余数判重)

    题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上.  首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...

随机推荐

  1. ##DAY13——可视化编程之XIB

    ##DAY13——可视化编程之XIB 1.关联控件 2.关联事件 3.关联手势 4.关联代理 这个时候即使不给控制器用下面方法添加代理,代理方法也是可以使用的,只是没有方法提示: 其他重要地方: #i ...

  2. 一周学会Mootools 1.4中文教程:(6)动画

    先看一下动画的参数设置: 参数: fps - (number:默认是50) 每秒的帧数. unit - (string:默认是 false) 单位,可为 'px','em',或 '%'. link - ...

  3. glib源码安装使用方法

    glib库是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事 ...

  4. Pro/Engineer wildfire 5.0 野火版系列下载及安装方法

    三.PTC Pro/Engineer wildfire 5.0 M030 野火版最新版 DVD 下载(多国语言) 1.野火下载站下载32&64位下载:[32位] http://down.pro ...

  5. 高级复制实验配置添加复制节点操作时报错:ORA-23308: object GP.T does not exist or is invalid

    出错原因: 使用高级复制时,在源端启动复制支持,执行语句:REPADMIN@bys1>execute dbms_repcat.generate_replication_support('gp', ...

  6. 自增字段 auto_commit的研究分析

    MySQL自增字段,自增字段计数器在主存储里面,不在硬盘上(This counter is stored only in main memory, not on disk). 1,添加表,设立自增主键 ...

  7. Wide character in print at hcp.pl line 21.

    jrhmpt01:/root# cat -n hcp.pl 1 use LWP::UserAgent; 2 use Encode; 3 $ua = LWP::UserAgent->new; 4 ...

  8. JAVA訪问URL

    JAVA訪问URL: package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

  9. ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量- ...

  10. POJ2151-Check the difficulty of problems(概率DP)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4512   ...