HDU 1226

3420 단어 cString
제목:http://acm.hdu.edu.cn/showproblem.php?pid=1226
그냥 BFS 면 돼.매번 여 수 를 보류 하고 무 게 를 판정 하 다.n = = 0 일 때 는 아버 지 를 너무 속 였 다.N 번 틀 렸 어.
다음은 AC 코드 입 니 다.
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int n,c,m;
int a[20];
int flag;
bool visited[5100];
string ans;
struct node{
    
    string ans;
    int mod;
}now;
void bfs(){
    queue<node >q;
    int i;
    for(i=1;i<16;i++){
        if(a[i]){
            visited[i%n]=1;
            if(i<10){
                
                now.ans="";      now.ans=i+'0';  now.mod=i%n;    q.push(now);
            }
            else{
                now.ans="";      now.ans='A'+i-10 ;  now.mod=i%n;    q.push(now);
                
            }
            
        }
    }
    
    while(!q.empty()){
        now=q.front();  q.pop();
        
        if(flag&&now.ans.size()>ans.size()) continue;
    //    cout<<now.ans<<endl;
        if(now.mod==0){
            if(!flag)  ans=now.ans;
            flag=1;
        

            if(ans.size()>now.ans.size()||(ans.size()==now.ans.size()&&ans>now.ans)){
                ans=now.ans;         
            }
                                                               
        }
        
        for(i=0;i<16;i++){
            if(a[i]){
                if(i<10){
                    node next=now;

                    next.ans+=(i+'0');
                    next.mod=(now.mod*c+i)%n;
                    
                    if((next.ans.size()<=500&&!visited[next.mod])||next.mod==0){
                        visited[next.mod]=1;
                        q.push(next);

                    }
                }
                else{
                    node next=now;
                    next.ans+=('A'+i-10);  
                    next.mod=(now.mod*c+i)%n;
                    
                    if((next.ans.size()<=500&&!visited[next.mod])||next.mod==0){
                        visited[next.mod]=1;
                        q.push(next);
                    }
                    

                }
            }
            
        }
        
    }
}
int main(){
    
    int t,i;
    

    cin>>t;
    
    while(t--){
        char str;
        scanf("%d%d%d",&n,&c,&m);
        getchar();
        memset(a,0,sizeof(a));
        memset(visited,0,sizeof(visited));
        for(i=0;i<m;i++) {
            scanf("%c",&str);
            if(str>='0'&&str<='9'){
                a[str-'0']=1;
            }
            else{
                a[str-'A'+10]=1;
            }
            getchar();
        }
        
  //     for(i=0;i<=16;i++)
    //       if(a[i]==1)
      //        cout<<i<<endl;

        flag=0;  ans="";
        
        if(n==0){
           // cout<<0<<endl;
            if(a[0]==1)
                cout<<0<<endl;
            else
                cout<<"give me the bomb please"<<endl;
            continue;
        }
        
        bfs();
        
        
        if(flag){
            cout<<ans<<endl;
        }
        else
            cout<<"give me the bomb please"<<endl;
    }
    return 0;
    
}

좋은 웹페이지 즐겨찾기