题目描述

已知有两个字串  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。

输入

第一行为两个字符串,第二行至文件尾为变换规则

   AB

   A1B1  \

   A2B2    |->   变换规则

     ...  ...  /    所有字符串长度的上限为  20。

输出

若在  10  步(包含  10步)以内能将  A变换为变换为B  ,则输出最少的变换步数;否则输出"NO ANSWER!"

样例输入

abcd xyz abc xu ud y y yz

样例输出

3

(⊙o⊙)…

大概并不是很简单,我以为BFS就行...

但是.....

时间超限...

尴尬,GG

(⊙o⊙)…双向BFS弄完了就只剩下一点string的东西了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<map>
using namespace std;
const int N=;
struct Node
{
string s;
int d;
};
map<string,int> m1,m2;
queue<Node> q1,q2;
string change[N][],ss;
Node s1,s2;
int k,ans;
int dbfs()
{
while(!q1.empty()||!q2.empty())
{
if(q1.front().d+q2.front().d>) break;
s1=q1.front();
int len=s1.s.length();
for(int i=;i<len;i++)
{
for(int j=;j<k;j++)
{
int tmp=change[j][].length();
ss=s1.s;
if(i+tmp-<len&&!s1.s.compare(i,tmp,change[j][])&&!m1.count(ss.replace(i,tmp,change[j][])))
{
s2.s=ss;
s2.d=q1.front().d+;
m1[s2.s]=s2.d;
q1.push(s2);
if(m2.count(s2.s))
{
return s2.d+m2[s2.s];
}
}
}
}
q1.pop();
s1=q2.front();
len=s1.s.length();
for(int i=;i<len;i++)
{
for(int j=;j<k;j++)
{
int tmp=change[j][].length();
ss=s1.s;
if(i+tmp-<len&&!s1.s.compare(i,tmp,change[j][])&&!m2.count(ss.replace(i,tmp,change[j][])))
{
s2.s=ss;
s2.d=q2.front().d+;
m2[s2.s]=s2.d;
q2.push(s2);
if(m1.count(s2.s))
{
return s2.d+m1[s2.s];
}
}
}
}
q2.pop();
}
puts("NO ANSWER!");
exit();
return ;
}
int main()
{
cin>>s1.s>>s2.s;
if(s1.s==s2.s){cout<<<<endl;return ;}
s1.d=s2.d=;
q1.push(s1);q2.push(s2);
m1[s1.s]=;m2[s2.s]=;
while(cin>>change[k][]>>change[k][])k++;
cout<<dbfs()<<endl;
return ;
}

RE的,谁大概给我看看为什么...

#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#include<queue>
using namespace std;
typedef struct{string s;int d;}point;
map<string,int> m1,m2;
queue<point> q1,q2;
string change[][],ss;
point s1,s2;
int k,ans; bool dbfs(){
while(!q1.empty()&&!q2.empty()){
if(q1.front().d+q2.front().d>)return false;
s1=q1.front();
int len=s1.s.length();
for(int i=;i<len;i++)
for(int j=;j<k;j++){
int tmp=change[j][].length();
ss=s1.s;
if(i+tmp-<len&&!s1.s.compare(i,tmp,change[j][])&&!m1.count(ss.replace(i,tmp,change[j][]))){
s2.s=ss;
s2.d=q1.front().d+;
m1[s2.s]=s2.d;
q1.push(s2);
if(m2.count(s2.s)){ans=s2.d+m2[s2.s];return true;}
}
}
q1.pop();
s1=q2.front();
len=s1.s.length();
for(int i=;i<len;i++)
for(int j=;j<k;j++){
int tmp=change[j][].length();
ss=s1.s;
if(i+tmp-<len&&!s1.s.compare(i,tmp,change[j][])&&!m2.count(ss.replace(i,tmp,change[j][]))){
s2.s=ss;
s2.d=q2.front().d+;
m2[s2.s]=s2.d;
q2.push(s2);
if(m1.count(s2.s)){ans=s2.d+m1[s2.s];return true;}
}
}
q2.pop();
}
return false;
} int main(){
cin>>s1.s>>s2.s;
if(s1.s==s2.s){cout<<<<endl;return ;}
s1.d=s2.d=;
q1.push(s1);q2.push(s2);
m1[s1.s]=;m2[s2.s]=;
while(cin>>change[k][]>>change[k][])k++;
if(dbfs())cout<<ans<<endl;
else printf("NO ANSWER!");
return ;
}

AC的...大概我还是不明白为什么RE...

[NOIP2002]字串变换 T2 双向BFS的更多相关文章

  1. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

  2. NOIP2002 字串变换题解(双向搜索)

    65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...

  3. NOIP2002字串变换[BFS]

    题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...

  4. NOIP2002-字串变换【双向BFS】

    NOIP2002-字串变换 Description 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规 ...

  5. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

  6. [NOIP2002] 字串变换 宽搜+深度优化

    这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...

  7. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

  8. 「NOIP2002」「Codevs1099」 字串变换(BFS

    1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 已知有两个字串 $A$, ...

  9. [NOIP2002] 提高组P1032 字串变换

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

随机推荐

  1. mini-tabs多个div并列,并可隐藏某个div

    <div class="mini-tabs" activeIndex="0" id="tabs"> <div title= ...

  2. combinations(组合)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  3. 你不知道你不懂javascript

    过去几年我注意到技术圈一个很奇怪的现象,有太多程序员将那些他们只是有过非常浅显的了解, 但其实根本就不懂的技术写到他们的简历中,这个现象几乎每种语言都有,但这其中最严重的就要数javascript了. ...

  4. [转]FFMpeg框架代码阅读

    简介 FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案. FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用.FFmpeg支持MPEG.Di ...

  5. java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)

    本人学习java时间不长,但是对java很感兴趣,知道有博客园这个平台果断的注册,记录我的java成长日记,这也是我的处女作,虽然很菜但是还是希望大家能见证我的成长,觉得可以的可以和我讨论一起学习 在 ...

  6. (function($){...})(jQuery) 含义 【转】

    经常用,今天总结一下,下文摘自某网友的总结: (function($){...})(jQuery)实际上是匿名函数,不懂得朋友可以继续往下看. 这里实际上是匿名函数 function(arg){... ...

  7. android sqlite android.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5

    Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标 if(c.moveToFirst()){// ...

  8. [ SSH框架 ] Struts2框架学习之四(自定义拦截器)

    一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...

  9. android studio 在使用图片的时候会检测图片的合法性

    1.当android studio 在使用png格式的时候,会报一系列的错误,甚至会显示找不到R文件,这是因为Android studio 不支持png格式的图片,检测图片的合法性的时候会报错 解决方 ...

  10. 什么是分布式锁及正确使用redis实现分布式锁

    分布式锁 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性. 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁 ...