luogu P1032 字串變換
阿新 • • 發佈:2017-10-15
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 字串變換