题目描述 Description

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

输入描述 Input Description

输入格式如下:

   A$ B$
   A1$ B1$ \
   A2$ B2$  |-> 变换规则
   ... ... / 
  所有字符串长度的上限为 20。

输出描述 Output Description

若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"

样例输入 Sample Input

abcd xyz
abc xu
ud y
y yz

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

hehe

思路:
双向广搜
代码:
#include<stdio.h>
#include<string.h>
struct node
{
char s[];
int dep; //变换次数
} list1[], list2[];
char a[][], b[][];
int n;
void BFS()
{
int head1, tail1, head2, tail2, k;
head1 = tail1 = head2 = tail2 = ;
while(head1 <= tail1 && head2 <= tail2)
{
if(list1[head1].dep + list2[head2].dep > )
{
printf("NO ANSWER!\n");
return ;
}
for(int i = ;i < strlen(list1[head1].s); i++)
for(int j = ; j <= n; j++)
if(strncmp(list1[head1].s + i, a[j], strlen(a[j])) == ) //寻找当前可变换的规则
{
tail1++; //移动尾指针,存储变换后的字符串,以下三个for循环为变换过程
for(k = ; k < i; k++)
list1[tail1].s[k] = list1[head1].s[k];
for(int l = ; l < strlen(b[j]); l++, k++)
list1[tail1].s[k] = b[j][l];
for(int l = i + strlen(a[j]); l <= strlen(list1[head1].s); l++, k++)
list1[tail1].s[k] = list1[head1].s[l];
list1[tail1].s[k] = '\0'; //为变换结束后的字符串加结束符
list1[tail1].dep = list1[head1].dep+;
for (k = ; k <= tail1; k++)
if (strcmp(list1[tail1].s, list2[k].s) == )//判断当前状态是否与逆向搜索交汇
{
printf("%d\n", list1[tail1].dep + list2[k].dep);
return ;
}
}
for (int i = ; i < strlen(list2[head2].s); i++) //逆向搜索同上
for (int j = ; j <= n; j++)
if(strncmp(list2[head2].s + i, b[j], strlen(b[j])) == )
{
tail2++;
for(k = ; k < i; k++)
list2[tail2].s[k] = list2[head2].s[k];
for(int l = ; l < strlen(a[j]); l++, k++)
list2[tail2].s[k] = a[j][l];
for(int l = i + strlen(b[j]); l <= strlen(list2[head2].s); l++, k++)
list2[tail2].s[k] = list2[head2].s[l];
list2[tail2].s[k] = '\0';
list2[tail2].dep = list2[head2].dep + ;
for (k = ;k <= tail1; k++)
if (strcmp(list1[k].s, list2[tail2].s) == )
{
printf("%d\n",list1[k].dep + list2[tail2].dep);
return ;
}
}
head1++;
head2++;
}
printf("NO ANSWER!\n");
}
int main()
{
scanf("%s%s",list1[].s, list2[].s);
n = ;
while (scanf("%s%s",a[n],b[n]) != EOF)
n++;
n--;
list1[].dep = list2[].dep = ;
BFS();
return ;
}

codevs1099 字串变换的更多相关文章

  1. codevs1099字串变换(Bfs)

    /* 最少步数问题 妥妥的Bfs 很显然队列里存的是串(可能存个数也可以 就像8数码那样) 然后每次队首元素弄出来 能换的都换一遍 最后每次换完的新串入队前先判断到头了没 最后说一句 String大法 ...

  2. 「NOIP2002」「Codevs1099」 字串变换(BFS

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

  3. NOIP2002字串变换[BFS]

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

  4. 字串变换(codevs 1099)

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

  5. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

  6. 字串变换 (2002 年NOIP全国联赛提高组)

    一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...

  7. NOIP 2002 提高组 字串变换

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

  8. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

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

  9. [NOIP2002]字串变换 T2 双向BFS

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

随机推荐

  1. OpenGL 2D模式

    // // left top 这里设置的默认是左上角 // void push_view2d(int left, int top, int width, int height) { //glPushA ...

  2. open_basedir 报错

    Warning: require(): open_basedir restriction in effect. File(/home/www/blog/vendor/autoload.php) is ...

  3. python自动化测试学习笔记-6excel操作xlwt、xlrd、xlutils模块

    python中通过xlwt.xlrd和xlutils操作xls xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把 ...

  4. 发生在升级OS X Yosemite后:修复各种开发环境

    本博文最初发布于我的个人博客<Jerry的乐园> 终于还是忍不住升级了,促使我升级的原动力居然是Alfred的Yosemite theme居然比初始theme好看很多!在升级前就预想到我的 ...

  5. Java 8 (4) Stream 流 - 使用

    在本节中将介绍Stream API支持的许多操作,这些操作可以完成更复杂的数据查询,如筛选.切片.映射.查找.匹配和归约.还有一些特殊的流如:数值流.来自文件和数组等多种来源的流. 筛选和切片 1.用 ...

  6. Spring Boot (28) actuator与spring-boot-admin

    在上一篇中,通过restful api的方式查看信息过于繁琐,也不直观,效率低下.当服务过多的时候看起来就过于麻烦,每个服务都需要调用不同的接口来查看监控信息. SBA SBA全称spring boo ...

  7. 简单3步,你即可以用上myFocus

    Step 1. 在html的标签内引入相关文件 <script type="text/javascript" src="js/myfocus-2.0.0.min.j ...

  8. npm install的时候报错 npm err code 1

    在学习vue的时候,npm install的时候报错  npm err code 1,当时很郁闷,是‘vue init webpack my-project’命令新建的模版项目 ,怎么会报错,第一次遇 ...

  9. JavaScript(十四)经典的Ajax

    (function(){ //唯一向外暴露一个顶层变量 var myajax = window.myajax = {}; //作者.版本号信息 myajax.author = "maxwel ...

  10. C# 调用Mysql 带参数存储过程

    使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...