您的位置:首页 > 其它

hdu 1226 BFS

2013-07-18 15:04 239 查看
一开始想着要写大数好麻烦啊。。。最后看了别人的代码瞬间觉得自己弱爆了。。。。。。值得以后学习。。。

AC代码如下:

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

int number[16];
int visit[5100], flag;
int N, C, M;
string ans;

typedef struct{
string now;
int mod;
}Node;

void BFS(){
queue<Node> q;
for( int i = 1; i < 16; i++ ){
if( number[i] ){
Node n;
n.now = "";
if( i < 10 ){
n.now = i + '0';
}else{
n.now = i - 10 + 'A';
}
n.mod = i % N;
visit[i%N] = 1;
q.push( n );
}
}
while( !q.empty() ){
Node n = q.front();
q.pop();
if( flag == 1 && ( n.now.size() > ans.size() ) ){
continue;
}
if( n.mod == 0 ){
if( flag == -1 ){
ans = n.now;
flag = 1;
}else{
if( n.now.size() < ans.size() ){
ans = n.now;
}else if( n.now.size() == ans.size() && n.now < ans ){
ans = n.now;
}
}
}
for( int i = 0; i < 16; i++ ){
if( number[i] ){
Node temp = n;
if( i < 10 ){
temp.now += i + '0';
}else{
temp.now += i + 'A' - 10;
}
temp.mod = ( temp.mod * C + i ) % N;
if( ( temp.now.size() <= 500 && visit[temp.mod] == 0 ) || temp.mod == 0 ){
visit[temp.mod] = 1;
q.push( temp );
}
}
}
}
}

int main(){
int t;
cin >> t;

while( t-- ){
memset( number, 0, sizeof( number ) );
memset( visit, 0, sizeof( visit ) );
ans = "";
flag = -1;
scanf( "%d%d%d", &N, &C, &M );
for( int i = 0; i < M; i++ ){
char temp[3];
scanf( "%s", temp );
if( temp[0] <= '9' && temp[0] >= '0' ){
number[temp[0]-'0'] = 1;
}else{
number[temp[0]-'A'+10] = 1;
}
}
if( N == 0 ){
if( number[0] ){
cout << "0" << endl;
}else{
cout << "give me the bomb please" << endl;
}
continue;
}
BFS();
if( flag == -1 ){
puts("give me the bomb please");
}else{
cout << ans << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: