题目链接: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. Anndroid 开发架构读书笔记

    市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- --------------- --------------- | | | | ...

  2. web之ios开关按钮

    就是这个开关,代码是从weui上拷贝出来的. 至于weui自己百度吧 ^_^~ 开关代码如下: <!DOCTYPE html> <html lang="en"&g ...

  3. 从头编译ARM交叉编译环境

    首先Cygwin需安装基本的命令 例如make binutils gcc 还有diffutils 没有他会报找不到cmp命令 这些都可以在setup.exe中找到 编译gcc时,需要注意一个原则:不要 ...

  4. 在输出视图中使用使用html注释会导致在Chrome中css失效

    在做SportsStore例子时,在视图List.cshtml中使用了html注释,即 <!-- 注释 --> 结果在加载css时,chrome浏览器中所有css效果都失效.IE不受影响. ...

  5. MYSQL this function has none of deterministic no sql ......错误

    This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...

  6. VS2010/MFC对话框:消息对话框

    消息对话框 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中经常用到消息对话框,所以MFC提供了两个函数可以直接生成指定风格的消息对话框,而不 ...

  7. 视频主观质量评价工具:MSU Perceptual Video Quality tool

    MSU Perceptual Video Quality tool是莫斯科国立大学(Moscow State University)的Graphics and Media Lab制作的一款视频主观评价 ...

  8. 使用COCOS2D-X JSB开发,在js页面中设置iOS键盘模式

    XYSDK.h void setKeyboardType(int type); XYSDK.cpp voidXYSDK::setKeyboardType(int type) { #if (CC_TAR ...

  9. sharepoint 2013 文档库 资源管理器打开报错 在文件资源管理器中打开此位置时遇到问题,将此网站添加到受信任站点列表,然后重试。

    我们在使用sharepoint 2013的文档库或者资源库的时候,经常会需要用到使用“资源管理器”来管理文档,但是有时候,点击“使用资源管理器打开”,会提示如下错误: 在文件资源管理器中打开此位置时遇 ...

  10. android之PackageManager简单介绍

    PackageManager相关 本类API是对全部基于载入信息的数据结构的封装,包含下面功能: 安装,卸载应用查询permission相关信息 查询Application相关信息(applicati ...