题目描述 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. WebSphere Application Server切换JAVA SDK版本

    最近在Windows Server 2008 R2服务器中搭建了一套IHS+WAS8.5集群环境,测试一个简单的demo应用没有问题,可是在部署正式应用时总是报类版本错误.换了好几个JDK对项目进行编 ...

  2. 选择语言之switch case

    程序语言-选择语言之switch   case 多选一,类似if    else if  else if  else 模版: Switch(选择条件) { Case(条件一)//相当于if Conso ...

  3. Android ListView动态刷新某项Item

    使用ViewHolder来刷新某项数据,而不用每次都全部刷新数据. 继承BaseAdapter,新建ViewHolder类. public class TestListAdapter extends ...

  4. 了解Selenium与自动化测试第一天“云里雾里”

    以前没有搭建过Selenium自动化功能测试环境,想象中就像QTP一样,集成IDE一般简单快捷. 昨天通过博客园的一篇博友日志,才开始大概认识到Selenium的工作方式与特征: 1.插件般与浏览器结 ...

  5. 北大ACM(POJ1016-Numbers That Count)

    Question:http://poj.org/problem?id=1016 问题点:水题. Memory: 232K Time: 125MS Language: C++ Result: Accep ...

  6. sublime text3 =个人插件

    1.sublime text3汉化插件安装. ctrl+shift+p → Package Control:Install Package → ChineseLocalization preferen ...

  7. 已集成 VirtIO驱动windows server 2012, 2008, 2003的ISO镜像下载

    已集成 VirtIO驱动简体中文windows server 2012, 2008, 2003系统ISO镜像下载地址. 适用于上传自定义ISO并且使用 VirtIO驱动的kvm架构vps,vultr家 ...

  8. GLPI开源资产管理系统

    GLPI一款资产管理系统,功能比较强大,东西比较多,放张图,有机会再深入研究

  9. 梦想CAD控件网页版扩展数据

    随着基于CAD的应用软件飞速发展,经常需要保存一些与图形可视性无关的数据,即非图形参数.例如在绘制化验样图中包含品位数据.MxCAD定义一类新的参数——实体扩展数据.扩展数据与实体的可视性无关,而是用 ...

  10. cmd命令安装、卸载、启动和停止Windows Service

    1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft.NET ...