洛谷 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 ’

共进行了 3 次变换,使得 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

思路:双向广搜
#include<cstring>
#include<cstdio>
#define M 100005
#define MM 55
using namespace std;
int n, add[], xl[], yl[];
char q[M][MM];
char p[M][MM];
char x[][MM], y[][MM]; int main() {
int i, j, k, xx, step, len;
char jiewei;
scanf("%s%s", q[], p[]);
jiewei = p[][strlen(p[])];
while(scanf("%s%s", x[n], y[n]) == ) {
xl[n] = strlen(x[n]), yl[n] = strlen(y[n]);
add[n] = yl[n] - xl[n];
n++;
}
if(n == ) { //判断两个字符串在不能变换的情况下能否相同
if(strcmp(q[], p[]) == ) printf("0\n");
//strcmp函数,判断两个字符串是否相同,当s1<s2时,返回为负数;当s1==s2时,返回值= 0;当s1>s2时,返回正数
else printf("NO ANSWER!\n");
return ;
}
int l1 = , r1 = , s1 = ;
int l2 = , r2 = , s2 = ;
for(step = ; step <= ; step++) {
for(i = ; i < n; i++)
for(j = l1; j <= r1; j++)
for(len = strlen(q[j]), k = ; k < len && len+add[i] < ; k++)
if(strncmp(x[i], q[j]+k, xl[i]) == ) {
s1++;
strncpy(q[s1], q[j], k);
//strncpy函数,将字符串src中最多n个字符复制到字符数组dest中
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]) == ) {
printf("%d\n", step+step-);
return ;
}
}
if(s1 != r1) l1 = r1+, r1 = s1;
for(i = ; i < n; i++)
for(j = l2; j <= r2; j++)
for(len = strlen(p[j]), k = ; k < len && len-add[i] < ; k++)
if(strncmp(y[i], p[j]+k, yl[i]) == ) {
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]) == ) {
printf("%d\n", step+step);
return ;
}
}
if(s2 != r2) l2 = r2+, r2 = s2;
}
printf("NO ANSWER!\n");
return ;
}

洛谷 P1032 字符变换的更多相关文章

  1. 洛谷 P1032 子串变换

    题目链接 https://www.luogu.org/problemnew/show/P1032 本题是一道bfs问题,从a串开始,每一步完成替换一对字符串(但是一个一步替换可以将这对字符串替换好几次 ...

  2. 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)

    洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...

  3. 题解-洛谷P7114 字符串匹配

    题面 洛谷P7114 字符串匹配 \(T\) 组测试数据.给定字符串 \(S\),问有多少不同的非空字符串 \(A\),\(B\),\(C\) 满足 \(S=ABABAB...ABC\) 且 \(A\ ...

  4. [洛谷P1032] 字串变换

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

  5. 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs

    题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...

  6. 洛谷P1032 字串变换【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...

  7. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

  8. 洛谷 P1032 字串变换

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

  9. 洛谷 P1032 字串变换(map)

    题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...

随机推荐

  1. RenderScript on LLVM笔记

    Android 为何引入 Render Script: 3D 可移植  ( 直接用 opengl 也能够移植呀?) 性能 易用性 ( 让 opengl 难入门的人,用 Render Script ?) ...

  2. Shiro架构及其组件

    Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等.这不就是我们想要的嘛,而且Shiro的API也是非常简单:其基本功能点如下图所示: Authentication:身份认证 ...

  3. 2015北京网络赛 J Scores bitset+分块

    2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...

  4. js获取当前时间年份,处理年月日

    js中获得当前时间年份.月份.日期       //获取完整的日期 var date=new Date; var y = date.getFullYear()var m = date.getMonth ...

  5. 2D上下文

    js中说明的上下文表示的意思为C++中作用域(个人理解),因此2D上下文说明的是这个2D的作用域 像素:用来描述图片清晰度的小矩阵 填充和描边 填充:context.fillStyle = " ...

  6. 通用查询实现方案(可用于DDD)[附源码] -- 简介

    原文:通用查询实现方案(可用于DDD)[附源码] -- 简介 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html).   [ ...

  7. CSDN博客给我带来的一些诱惑和选择机会(二):HR“邀请于我”,猎头“有求于我”

    上次,2013年10月8日 ,分享了一篇颇具"正能量"的文章CSDN博客给我带来的一些诱惑和选择机会,获得了很好的正面效果. 10月份,又发生了很多有趣.有意义的事情. 其中,有一 ...

  8. oracle 查询某个时间段数据

    SELECT * FROM DRP_MARKET_PRODUCT T WHERE T.CREATEDTIME BETWEEN TO_DATE('2016-10-08 12:30', 'yyyy-mm- ...

  9. Python 爬取单个网页所需要加载的地址和CSS、JS文件地址

    Python 爬取单个网页所需要加载的URL地址和CSS.JS文件地址 通过学习Python爬虫,知道根据正式表达式匹配查找到所需要的内容(标题.图片.文章等等).而我从测试的角度去使用Python爬 ...

  10. CF(438D) The Child and Sequence(线段树)

    题意:对数列有三种操作: Print operation l, r. Picks should write down the value of . Modulo operation l, r, x. ...