1. 程式人生 > >P1032 字串變換(replace函式)

P1032 字串變換(replace函式)

題目描述

已知有兩個字串 A, B 及一組字串變換的規則(至多6個規則):

A1 -> B1

A2 -> B2

規則的含義為:在 A$中的子串 A1 可以變換為 B1、A2 可以變換為 B2 …。

例如:A=’abcd’B=’xyz’

變換規則為:

‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’

則此時,A 可以經過一系列的變換變為 B,其變換的過程為:

‘abcd’->‘xud’->‘xy’->‘xyz’

共進行了三次變換,使得 A 變換為B。

輸入輸出格式 輸入格式:

鍵盤輸人檔名。檔案格式如下:

A B A1 B1 \

A2 B2 |-> 變換規則

… … /

所有字串長度的上限為 20。

輸出格式:

輸出至螢幕。格式如下:

若在 10 步(包含 10步)以內能將 A 變換為 B ,則輸出最少的變換步數;否則輸出"NO ANSWER!"

輸入輸出樣例

輸入樣例#1:abcd xyz abc xu ud y y yz

輸出樣例#1:3

這道題明顯看出就是bfs,唯一困難的一點就是在字串的處理上……如何按照規則替換原有字元變成新的字串並放到佇列中,當然這些如果知道string的replace函式的話就不是問題……

replace(替換第i個字元開始,替換長度,替換舊字串的新字串)

順便標記字串是否用過可以用map

以下程式碼orz

#include <iostream>
#include <queue>
#include <map>
#include <string>
using namespace std;
//abcd xyz
//abc xu
//ud y
//y yz
string r[110],q[110];
map <string,int> flag;
struct st{
    
    string str;
    int step;
    
    st(string a,int b):str(a),step(b){}
};
int main()
{
    queue <st> qe;
    
    string a,b;
    
    cin>>a>>b;
    
    int i=0,j,k;
    
    while(cin>>r[i]>>q[i]) i++;
    
    int n=i;
    
    qe.push(st(a,0));
    
    while(!qe.empty()){
        
        st t=qe.front();
        
        qe.pop();
        
        if(t.step>10){
            
            cout<<"NO ANSWER!"<<endl;
            return 0;
        }
        
        if(b==t.str){
            
            
            cout<<t.step<<endl;
            return 0;
        }
        
        for(i=0;i<n;i++){
            
            for(j=0;j<t.str.length();j++){
                
                if(t.str[j]==r[i][0]){
                    
                    int g=j;
                    
                    int p=j;
                    
                    bool flag1=1;
                    
                    for(k=1,p=j+1;k<r[i].length()&&p<t.str.length();k++,p++){
                        
                        if(t.str[p]!=r[i][k]){
                            
                            flag1=0;
                            break;
                            
                        }
                        
                        
                    }
                    
                    if(flag1){
                        
                        string h=t.str;
                        
                        h.replace(g,r[i].length(),q[i]);
                        
                        if(!flag[h]){
                            
                            qe.push(st(h,t.step+1));
                            
          //                  cout<<h<<endl;
                                
                            flag[h]=1;
                        }
                        
                      
                        
                    }
                    
                }
                
                
            }
            
            
        }
        
    }
    
    cout<<"NO ANSWER!"<<endl;
    
    return 0;
    
}