1. 程式人生 > >luogu P1032 字串變換

luogu P1032 字串變換

algorithm nbsp ont 三次 log namespace 例如 blog !=

題目描述

已知有兩個字串 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

貌似有點偏離題意,最後一點過不了
#include <iostream>
#include 
<cstdio> #include <algorithm> #include <cstring> #include <string> #include <queue> #include <map> using namespace std; struct Node{ string str; int tot; }; Node ST, topp; int n = 1, js, len_from[21]; string s1, s2, now_st, nxt; string from
[10], to[10]; queue <Node> Q; map <string, bool> mp; inline bool pd_out(string s) { if(mp[s]) return 0; else mp[s] = 1; return 1; } inline void pd_answer(string s, int answer) { if(s == s2) { printf("%d", answer); exit(0); } } inline void bfs() { ST.str = s1; ST.tot = 0; Q.push(ST); while(!Q.empty()) { topp = Q.front(); //cout<<"topp:"<<topp<<endl; Q.pop(); //if(topp.tot == 11) //return ; string topp_st = topp.str; for(int i = 1; i <= n; i ++) { now_st = from[i]; int Find = topp_st.find(now_st); if(Find != -1) { nxt.clear(); for(int j = 0; j < Find; j ++) nxt += topp_st[j]; nxt += to[i]; int len = len_from[i]; int now_len = topp_st.length(); for(int j = Find + len_from[i]; j <= now_len - 1; j++) nxt += topp_st[j]; pd_answer(nxt, topp.tot + 1); if(pd_out(nxt)) { Node nxt_in; nxt_in.str = nxt; nxt_in.tot = topp.tot + 1; Q.push(nxt_in); } } } } } int main() { cin >> s1 >> s2; while(cin >> from[n] >> to[n]) { len_from[n] = from[n].length(); n ++; } n --; bfs(); printf("NO ANSWER!"); return 0; } /* abaaaba abcdaba a b b d d e e f f g g c */

有一個函數substr

#include <cstdio>
#include <iostream>
#include <string>
#include <queue>
#include <set>
#include <cstring>

using namespace std;
string a, b;

struct node{
    string fr,to;
}s[20];
int ind=1;
struct po
{
    string pr;
    int t;
    po(string tmp,int te)
    {
        pr=tmp;
        t=te;
    }
};
queue<po> que;
set<string> ss;
int main()
{
    for(int i = 1; i <= -121212; i ++)
        cout<<"dshafjdsfsdfasdfadfas";
    cin>>a>>b;
    while(cin>>s[ind].fr>>s[ind].to) ind++;
    ind--;
    que.push(po(a,0));
    ss.insert(a);
    while(!que.empty())
    {
        string tmp=que.front().pr;
        int t=que.front().t;
        que.pop();
        if(t>10) continue;
        if(tmp==b)
        {
            cout<<t<<endl;
            return 0;
        }
        for(int i=1;i<=ind;i++)
        {
            for(int j=0;j<=int(tmp.size())-int(s[i].fr.size());j++)
            {
                if(tmp.substr(j,s[i].fr.size())==s[i].fr)
                {
                    string pp=tmp.substr(0,j)+s[i].to;
                    if(j+s[i].fr.size()<tmp.size())
                        pp+=tmp.substr(j+s[i].fr.size());
                    if(ss.find(pp)==ss.end())
                    {
                        ss.insert(pp);
                        que.push(po(pp,t+1));
                    }
                }
            }
        }
    }
    printf("NO ANSWER!");
  return 0; }

luogu P1032 字串變換