洛谷 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. Linux Unix shell 编程指南学习笔记(第五部分)

    第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...

  2. 在Linux终端使用W3M浏览器下载文件

    在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...

  3. 124.C++输出小结

    #include <iostream> #include <iomanip> using namespace std; void main() { ////调用cout的成员函 ...

  4. Android 使用Retrofit请求API数据

    概览 Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库.这个库为网络认证.API请求以及用OkHttp发送网络请求提供了强大的框架 .理解OkHttp 的工作流程见  这个 ...

  5. BZOJ3435: [Wc2014]紫荆花之恋(替罪羊树,Treap)

    Description 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是 ...

  6. 解决MyEclipse中安装或升级ADT之后SDK Target无法显示的问题

        故障现象,在MyEclipse里面安装完最新的android sdk和ADT之后,无法新建项目,Build Target为空,显示一直在loading.即如下面图里面显示的,Target Na ...

  7. 洛谷—— P1328 生活大爆炸版石头剪刀布

    https://www.luogu.org/problem/show?pid=1328 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在< ...

  8. dlmalloc 2.8.6 源代码具体解释(5)

    本文章由vector03原创, 转载请注明出处. 邮箱地址: mmzsmm@163.com, 欢迎来信讨论.     3. 分配及实现 本章节介绍dlmalloc的分配算法和实现.由于存在多mspac ...

  9. Vue v-bind的使用

    1.src <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  10. 智课雅思词汇---三、aud和auto和bene是什么意思

    智课雅思词汇---三.aud和auto和bene是什么意思 一.总结 一句话总结:aud:听 auto:自己,self bene:good,well 1.anthropo是什么意思? anthropo ...