洛谷 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. js插件---图片裁剪photoClip

    js插件---图片裁剪photoClip 一.总结 一句话总结:页面裁剪图片得到base64格式的图片数据,然后把这个数据通过ajax上传给服务器,服务器将base64图片数据解析成图片并且保存到服务 ...

  2. 23.IDEA 运行junit单元测试方法

    转自:https://blog.csdn.net/weixin_42231507/article/details/80714716 配置Run,增加Junit 最终配置如下:

  3. Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)

    Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...

  4. Yeslab 华为安全HCIE-第五门-防火墙攻击防范技术

    Yeslab 华为安全HCIE-第五门-防火墙攻击防范技术 课程目录 Yeslab华为安全HCIE-第五门-防火墙攻击防范技术(8篇)\1_单包攻击防范.aviYeslab华为安全HCIE-第五门-防 ...

  5. HttpClient方式调用接口的java 简单案例源码+附jar包

    1 package com.itNoob.httpClient; import org.apache.commons.httpclient.HttpClient; import org.apache. ...

  6. 可靠的UDP连接 & MTU MSS

    这个网页里面写了: http://blog.csdn.net/plusboy/article/details/1523308 其可靠性必须由上层应用实现.一般都会采用消息重传来实现其可靠性,采用消息重 ...

  7. HTTP请求和响应1:概述

    HTTP的报文分为请求报文和响应报文,打开一个web页面后,浏览器将发起一个HTTP请求报文.HTTPserver收到请求后将回送一个响应报文. 报文的基本结构 HTTP的请求和响应报文都由三个部分组 ...

  8. gvim window7 下提示乱码

    今天在win7下安装gvim的时候,发现所有的提示信息都是乱码的,在网上找到了如下的解决方案.在此记录下,方便以后查阅. 以下内容转载自http://blog.csdn.net/rehung/arch ...

  9. POJ 2181 贪心

    思路: 贪心 对于每个波浪 ans+=最大值-最小值 注意最后一定是选最大值 //By SiriusRen #include <cstdio> using namespace std; i ...

  10. Elasticsearch之源码编译

    前期博客 Elasticsearch之下载源码 步骤 (1)首先去git下载源码 https://github.com/elastic/elasticsearch/tree/v2.4.3 下载下来,得 ...