题目描述

已知有两个字串  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. java——抽象

    抽象类:特点:1,方法只有声明,没有实现时,该方法就是抽象方法,需要被abstract关键字修饰.抽象方法必须定义在抽象类中,该类也必须被abstract修饰2,抽象类不可以被实例化.为什么?因为调用 ...

  2. Mysql安装和登录相关操作

    一.mysql的下载和安装 1.下载链接地址 http://dev.mysql.com/downloads/mysql/ 安装如下操作进行下载. 2.mysql数据库安装(Windows环境) 1.解 ...

  3. Apache Solr vs Elasticsearch

    http://solr-vs-elasticsearch.com/ Apache Solr vs Elasticsearch The Feature Smackdown API Feature Sol ...

  4. 日常踩坑笔记:spring的context:property-placeholder标签

    背景: 原来的项目一直跑着没有问题,今天突然想在原有项目的基础上,加上redis进行数据的缓存,原来项目的架构就是传统的SSM框架,于是,大刀阔斧的开始改装了... 编写redis的配置文件——red ...

  5. 微信小程序-设计指南

    基于微信小程序轻快的特点,官方拟定了小程序界面设计指南和建议,可作为小程序开发参考. 友好礼貌 -避免用户使用服务时被周围环境干扰,设计时应减少无关设计对用户的影响,礼貌的向用户提供服务,友好的引导用 ...

  6. JavaScript中push ,pop ,concat ,join方法

    push 方法 将新元素添加到一个数组中,并返回数组的新长度值. arrayObj.push([item1 [item2[. . . [itemN ]]]]) 说明 push 方法将以新元素出现的顺序 ...

  7. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  8. 团队项目第二阶段个人进展——Day9

    一.昨天工作总结 冲刺第九天,完成图片的优化,与队友一起讨论如何合并并优化 二.遇到的问题 无 三.今日工作规划 合并后优化

  9. java(二、基础语法和基本数据类型)

    Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...

  10. Java IO流对象、多线程

    Input(读) Output(写)操作 File类 import java.io.File; 将操作系统中的文件.目录(文件夹).路径.封装成File对象 提供方法,操作系统中的内容.File与系统 ...