题目描述

已知有两个字串  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. Collections.sort自定义排序的使用方法

    Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...

  2. 用eclipse运行和部署myeclipse项目

    版本:Eclipse-jee-indigo(3.7) 配置Project Facets 点击项目选择 properties -->Project Facets--> Dynamic Web ...

  3. Oracle12c中性能优化&amp;功能增强新特性之临时undo

    临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题. 1)  写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库 ...

  4. Python flask中的配置

    当你开始学习Flask时,配置看上去是小菜一碟.你仅仅需要在config.py定义几个变量,然后万事大吉. 然而当你不得不管理一个生产上的应用的配置时,这一切将变得棘手万分. 你不得不设法保护API密 ...

  5. python pandas import 失败

    今天因为数据处理的需要,安装了pandas. 我的python版本是2.7,使用的编辑器是pycharm.我现在cmd中输入了pip install pandas,然后显示安装成功,但是在使用pand ...

  6. require、缓存

    什么是require? -Node使用CommonJS模块规范,内置require函数用于加载模块文件 -require的基本功能是>读入并执行一个javascript文件,然后返回该模块的ex ...

  7. 完美解决IE渲染方式进入兼容模式问题

    <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"> &l ...

  8. 学习Vue.js之vue移动端框架到底哪家强

    官网:https://cn.vuejs.org/. 转载:http://www.cnblogs.com/8899man/p/6514212.html Weex 2016年4月21日,阿里巴巴在Qcon ...

  9. 第一章 C++概述

    第一节 C++语言的发展历史 略 第二节 C++语言的特点 1.C++是一种面向对象的程序设计语言,其中的新技术主要包括: 抽象数据类型 封装和信息隐蔽 以继承和派生方式实现程序的重用 以运算符重载和 ...

  10. cocos2d-x工作小记

    1.当一个layer跳到下一个layer时,需要传递数据,可以默认定义一个setUserData()方法. 2.cocos2d-x不使用传统的值类型,所有的对象都创建在堆上,然后通过指针引用. 3.传 ...