华师一附中OI组
标题:
P1032 字串变换
[打印本页]
作者:
admin
时间:
2018-5-11 19:41
标题:
P1032 字串变换
https://www.luogu.org/problemnew/show/P1032
题目描述
已知有两个字串 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
作者:
黄煦喆
时间:
2018-6-9 20:39
80分
#include<iostream>
#include<queue>
using namespace std;
string s1[10],s2[10];
string a,b,p1,p2;
struct st
{
string s;
int step;
} f[1000001];
queue<st>q;
int main()
{
cin>>a>>b;
int n=1;
while(cin>>p1>>p2)
{
s1[n]=p1;
s2[n]=p2;
n++;
}
f[1].s=a;
f[1].step=0;
q.push(f[1]);
while(q.size())
{
st t=q.front();
q.pop();
if(t.s==b)
{
cout<<t.step;
return 0;
}
else for(int i=1; i<=n; i++)
{
int r=t.s.find(s1[i]);
if(r!=-1)
{
st m=t;
m.step++;
if(m.step>10)
{
cout<<"NO ANSWER!";
return 0;
}
m.s.erase(r,s1[i].size());
m.s.insert(r,s2[i]);
q.push(m);
}
}
}
return 0;
}
复制代码
作者:
admin
时间:
2018-6-9 20:59
很好 能够这样,不错了!
作者:
YTC
时间:
2018-7-3 19:19
#include<bits/stdc++.h>
using namespace std;
string st,en;
string s1[10],s2[10];
int cnt=1;
bool ju(string s,int l,string s1)
{
if(l+s1.size()>s.size()) return 0;
if(s.substr(l,s1.size())==s1) return 1;
else return 0;
}
queue<string> q;
set<string> ss;
map<string,int> d;
int main()
{
cin>>st>>en;
while(cin>>s1[cnt]>>s2[cnt]) cnt++;
cnt--;
q.push(st);
ss.insert(st);
d[st]=0;
while(!q.empty())
{
string u=q.front();
q.pop();
if(u==en) {cout<<d[u];return 0;}
for(int i=1;i<=cnt;i++)
for(int j=0;j+s1[i].size()<=u.size();j++)
{
if(ju(u,j,s1[i]))
{
string s=u.substr(0,j)+s2[i]+u.substr(j+s1[i].size(),u.size()-(j+s1[i].size())+1);
if(!ss.count(s))
{
d[s]=d[u]+1;
if(d[s]<=10)
{
ss.insert(s);
q.push(s);
}
}
}
}
}
cout<<"NO ANSWER!";
return 0;
}
复制代码
作者:
YTC
时间:
2018-7-3 19:19
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-9-9 15:23
#include<iostream>
#include<queue>
#include<map>
using namespace std;
string s2,s[7][2],k;
int num,as;
struct node
{
int step;
string s1;
}p;
map<string,int>b;
queue<node>q;
int main()
{
cin>>p.s1>>s2;
int j=1;
while(cin>>s[j][0]>>s[j][1])
{
j++;
num++;
}
p.step=0;
q.push(p);
while(q.front().step<=10 && !q.empty())
{
if(b[q.front().s1]==1)
{
q.pop();
continue;
}
b[q.front().s1]=1;
if(q.front().s1==s2)
{
cout<<q.front().step<<endl;
return 0;
}
for(int i=1;i<=num;i++)
{
k=q.front().s1;
as=k.find(s[i][0]);
while(as!=-1)
{
j=as;
p.step=q.front().step+1;
p.s1=k;
p.s1.replace(as,s[i][0].size(),s[i][1]);
q.push(p);
as=k.find(s[i][0],j+1);
}
}
q.pop();
}
cout<<"NO ANSWER!"<<endl;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-10-25 21:23
#include<iostream>
#include<string>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
string a,b,x[15],y[15];
int c=1,ans,ttq;
struct node{string str;int step;};
map<string,int>mp;
string hyf(const string &str,int i,int j)
{
string ans1="";
if(i+x[j].size() > str.size() ) return ans1;
FOR(k,0,x[j].size()-1)
if(str[i+k]!=x[j][k])
return ans1;
ans1=str.substr(0,i);
ans1+=y[j];
ans1+=str.substr(i+x[j].size());
}
/*string hyf(const string &str,int i,int j){//借鉴了stdcall大爷的思想
string ans = "";
if (i+x[j].length() > str.length())
return ans;
for (int k=0; k < x[j].length();k++)
if (str[i+k] != x[j][k])
return ans;
ans = str.substr(0,i);
ans+=y[j];
ans+=str.substr(i+x[j].length());
return ans;
}*/
void bfs()
{
queue <node> q;
node tt;
tt.str=a;
tt.step=0;
q.push(tt);
while(!q.empty())
{
node u=q.front();
q.pop();
if(mp.count(u.str)==1) continue;
if(u.str==b) {ans=u.step;break;}
string temp;
mp[u.str]=1;
FOR(j,1,c)
{
///ttq=u.str.size()-x[j].size()-1;ttq=max(ttq,0);
FOR(i,0,u.str.size()-1)
{
///cout<<u.str.size()<<" "<<x[j].size()<<' '<<ttq<<endl;
temp=hyf(u.str,i,j);
if(temp!="")
{
///cout<<temp<<endl;
node v;
v.str=temp;
v.step=u.step+1;
q.push(v);
}
}
}
}
if(ans>10 || ans==0)
cout << "NO ANSWER!" << endl;
else
cout<<ans;
}
int main()
{
cin>>a>>b;
while(cin >> x[c] >> y[c]) c++;c--;
bfs();
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2