题目描述 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. ROS-USB摄像头

    前言:演示使用usb摄像头功能,推荐使用方法二. 首先要有一个usb摄像头,本次使用的是罗技(Logitech)摄像头. 一.使用软件库里的uvc-camera功能包 1.1 检查摄像头 lsusb ...

  2. css为tbody或者li奇数偶数行样式

    <style> table tbody tr:nth-child(odd){ background:#fff; } table tbody tr:nth-child(even){ back ...

  3. apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解)

    不多说,直接上干货! Storm的版本选取 我这里,是选用apache-storm-0.9.6.tar.gz Storm的本地模式安装 本地模式在一个进程里面模拟一个storm集群的所有功能, 这对开 ...

  4. IKanalyzer、ansj_seg、jcseg三种中文分词器的实战较量

    转自:http://lies-joker.iteye.com/blog/2173086 选手:IKanalyzer.ansj_seg.jcseg 硬件:i5-3470 3.2GHz 8GB win7 ...

  5. Java常见问题总结(二)

    1.配置完Java环境变量之后,仍然不能使用java命令. 解决方法: 如果是Windows10系统出现此问题,是因为个别Windows10系统不识别“JAVA_HOME”环境变量,将path中所有的 ...

  6. Android开发笔记(3)——GridLayout

    笔记链接:http://www.cnblogs.com/igoslly/p/6799939.html GirdLayout 计算器实例及详尽的笔记:http://www.cnblogs.com/sky ...

  7. DOM节点例子

    elementNode.setAttribute(name,value) 1.name: 要设置的属性名. 2.value: 要设置的属性值. elementNode.getAttribute(nam ...

  8. 史上最大型广告欺诈活动Methbot:黑客是如何每天赚到500万美元的

    根据国外安全专家的最新报告,有一群黑客正在对美国的知名企业和媒体机构进行广告欺诈活动,而这群黑客每天都可以从中赚取三百万到五百万美金. 是的,你没看错,这绝对是人类历史上最牛X的恶意广告欺诈活动!不过 ...

  9. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  10. UI布局术语

    horizontal, vertical top, left, bottom, right UIEdgeInsets margin与padding Interpreting Values Values ...