洛谷 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!"
输入输出样例
abcd xyz
abc xu
ud y
y yz
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 字符变换的更多相关文章
- 洛谷 P1032 子串变换
题目链接 https://www.luogu.org/problemnew/show/P1032 本题是一道bfs问题,从a串开始,每一步完成替换一对字符串(但是一个一步替换可以将这对字符串替换好几次 ...
- 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)
洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...
- 题解-洛谷P7114 字符串匹配
题面 洛谷P7114 字符串匹配 \(T\) 组测试数据.给定字符串 \(S\),问有多少不同的非空字符串 \(A\),\(B\),\(C\) 满足 \(S=ABABAB...ABC\) 且 \(A\ ...
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs
题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 洛谷 P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 洛谷 P1032 字串变换(map)
题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...
随机推荐
- 找出一堆数中最小的前K个数
描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...
- RvmTranslator6.6 - RVM to CATIA
RvmTranslator6.6 - RVM to CATIA eryar@163.com RvmTranslator can translate the RVM file exported by A ...
- 面试基础_03实现strcpy、strcat、strcmp、strlen
实现代码例如以下: /************************************************************************* > File Name: ...
- UITableView去掉最后切割线的一种方法
UITableView以style:UITableViewStylePlain方式创建时.仅仅要有cell,就会有一条黑线 哪怕至于一个cell也会有,如图 在网上找了集中方法,都不好使,比方http ...
- javascript 左侧菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue-router学习例子分享
http://blog.csdn.net/bboyjoe/article/details/52804988 <!DOCTYPE html> <html lang="en&q ...
- Windows 一键关闭UAC、防火墙、IE配置脚本
有时候,在环境需求下,需要关闭windows防火墙,UAC,以及IE选项配置. 对不懂电脑来说是比较麻烦的,老是得教他们,关键还记不住…… so,以下脚本就可以解决这个问题 注:脚本 需要右键 以管理 ...
- PHP读取txt文件到数据库
<?PHP$txt=$C->SITE_URL.'images/my.txt';$row = file($txt); //读出文件中内容到一个数组当中 $num=0;//统计表中的记录数 f ...
- 软件设计师必备——操作系统·
引子: 在今天,我们对于操作系统已经很熟悉,不论是微软的windows还是苹果的Mac OS X,包扩当先很流行的android都在操作系统范畴,而这些操作系统尽管各有各的特点,可是,作为总体,我们能 ...
- Lucene-全文索引
近期接触了lucene,我想也有非常多人以前听过,于是带着好奇心,我開始对lucene进行了解,给我影响最深的是它非常多的应用了索引表,这个工具之所以快是就是由于大量引用到了索引表.今天仅仅说下我刚開 ...