P1124字串变换

Accepted

标签:搜索 搜索与剪枝NOIP提高组2002

描述

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

样例输入1[复制]

abcd xyz
abc xu
ud y
y yz

样例输出1[复制]

3

限制

每个测试点1s

来源

noip2002提高组第二题

解析:设从正向开始扩展的状态储存在q数组,[l1,l2]为当前正向扩展出的状态,p数组以及l2,r2的定义类似。

正向每扩展出一个状态,就在[l2,r2]中暴力查找是否存在相同的状态,若有,则得到答案。

逆向扩展与正向扩展类似。

我这里采用的是交替扩展,即正向扩展一次,然后逆向扩展一次。当然,也可以每次选择状态数更少的那个进行扩展,实际上这种方法更好。

代码:

#include<cstdio>
#include<cstring>
#define maxn 100000
#define max_len 50
using namespace std;char q[maxn+10][max_len+10];
char p[maxn+10][max_len+10];
char x[10][max_len],y[10][max_len];
int n=0,add[10],xl[10],yl[10];int main()
{int i,j,k,xx,step,len;char jiewei;scanf("%s%s",q[0],p[0]);jiewei=p[0][strlen(p[0])];while(scanf("%s%s",x[n],y[n])==2){xl[n]=strlen(x[n]),yl[n]=strlen(y[n]);add[n]=yl[n]-xl[n];n++;}if(n==0){if(strcmp(q[0],p[0])==0)printf("0\n");else printf("NO ANSWER!\n");return 0;  }int l1=0,r1=0,s1=0;int l2=0,r2=0,s2=0;for(step=1;step<=5;step++){for(i=0;i<n;i++)for(j=l1;j<=r1;j++)for(len=strlen(q[j]),k=0;k<len && len+add[i]<max_len;k++)if(strncmp(x[i],q[j]+k,xl[i])==0){s1++;strncpy(q[s1],q[j],k);strncpy(q[s1]+k,y[i],yl[i]);strncpy(q[s1]+k+yl[i],q[j]+k+xl[i],len-k-xl[i]);q[s1][len+add[i]]=jiewei;for(xx=l2;xx<=r2;xx++)if(strcmp(p[xx],q[s1])==0){printf("%d\n",step+step-1);return 0;}}if(s1!=r1)l1=r1+1,r1=s1;        for(i=0;i<n;i++)for(j=l2;j<=r2;j++)for(len=strlen(p[j]),k=0;k<len && len-add[i]<max_len;k++)if(strncmp(y[i],p[j]+k,yl[i])==0){s2++;strncpy(p[s2],p[j],k);strncpy(p[s2]+k,x[i],xl[i]);strncpy(p[s2]+k+xl[i],p[j]+k+yl[i],len-k-yl[i]);p[s2][len-add[i]]=jiewei;for(xx=l1;xx<=r1;xx++)if(strcmp(q[xx],p[s2])==0){printf("%d\n",step+step);return 0;}}if(s2!=r2)l2=r2+1,r2=s2;                    }  printf("NO ANSWER!\n");    return 0;
}

  • 递交评测
  • 查看与发表题解
  • 查看本题递交记录

我的记录

  • 我的所有递交记录
07-24 Accepted

题目讨论

发表题目讨论
08-23 这个题目比较屌……
05-11 样例输出什么情况
03-24 C++的在Linux不能过?
10-31 P1124疑难
10-12 诡异的编译失败…请大牛帮忙
10-12 一个题目理解方面的问题
07-21 215
03-19 使用C语言,此题能AC吗?
02-07 大牛来一下

noip2002 字串变换 (双向宽搜,交替扩展)相关推荐

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

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

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

    展开 题目背景 本题疑似错题,不保证存在靠谱的多项式复杂度的做法.测试数据非常的水,各种做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 题目描述 已知有两个字串 A,BA,B 及一组字串 ...

  3. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  4. 洛谷P1032字串变换题解--zhengjun

    题目描述 已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则): A1A_1A1​ −-−> B1B_1B1​ A2A_2A2​ −-−> B2B_2B2​ 规则的含义 ...

  5. 1099 字串变换 2002年NOIP全国联赛提高组

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

  6. P1032 字串变换(bfs)

    https://www.luogu.org/problemnew/show/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A 1-> B 1 A 2 ...

  7. 字串变换(洛谷-P1032)

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

  8. NOIP 2002 字串变换

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

  9. 用双向宽搜来提高搜索效率

    在信息竞赛中,常常会遇到一些用广度优先搜索才能实现的题目,而这类题目很大一部分都可以用双向宽搜来提高搜索速度, 这类题目的共同点是: 1.   起始状态和目标状态都很明确: 2.  搜索一条从起始状态 ...

最新文章

  1. AGAT|GTF/GFF文件处理工具
  2. 如何做一名专业的软件测试工程师
  3. 深度优先遍历和广度优先遍历_利用广度优先搜索解LeetCode第515题:在每个树行中找最大值...
  4. becon帧 wifi_WireShark对于WIFI数据帧的分析
  5. 阿里云有一群 “猪猪侠”
  6. 深入理解Kafka(4)-主题与分区
  7. 最常见的读入数据方法集锦
  8. Overflow属性详解(转载)
  9. Bootstrap 按钮菜单的尺寸
  10. 【转载】Ogre的内存分配策略
  11. android 方形按钮代码,Android中实现图文并茂的按钮实例代码
  12. PyCharm安装步骤
  13. 苹果新款笔记本_苹果又在准备一批笔记本,12英寸MacBook终于要更新了吧?
  14. Red Hat 6 安装 Yum源
  15. 互动教程 for Excel 2016
  16. 简单方法去除视频水印
  17. 博士计算机毕业论文格式,博士毕业论文格式类型要求
  18. php的网页服务器根目录,php获得网站根目录的几个方法
  19. 【css默认设置】---- 关于CSS Reset 那些事(一)之 历史演变与Normalize.css
  20. ArcGIS教程:山地风景区景观规划中的可视性分析

热门文章

  1. thinkphp构架
  2. 罗永浩宣布独家签约抖音 称希望成抖音一哥
  3. ajax请求数据成功但是success中拿不到数据。
  4. 天涯明月刀最新服务器,天涯明月刀手游手游开服表_天涯明月刀手游手游开服时间表_新服新区预告_第一手游网...
  5. java 时间差 long,java计算时间差及比较时间大小
  6. 计算机考研340分什么概念,考研340分什么概念_中国考研网官网入口
  7. input触发的事件触发流程
  8. 校园网及入网计算机管理制度,校园网用户入网管理规定
  9. 【Linux回炉 目录配置】
  10. PHP检测字数,PHP获取word文档字数的问题