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

例如:A=′abcd′B='abcd' B=′abcd′ B=’xyz’
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A可以经过一系列的变换变为B可以经过一系列的变换变为B可以经过一系列的变换变为B,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得A变换为B变换为B变换为B。

  • 输入
    一组测试数据,每组输入的第一行输入两个字符串A和B和B和B。
    接下来若干行输入变换规则:
    A$ B$
    A1$ B1$
    A2$ B2$ |-> 变换规则
    … … /
    所有字符串长度的上限为 20。
  • 输出
    对于每组输入数据,若在10步(包含10步)以内能将A变换为B变换为B变换为B,则输出最少的变换步数,否则输出"NO ANSWER!"。
    样例输入

abcd xyz
abc xu
ud y
y yz

样例输出

3

bfs搜索,将所有变换存储,找到替换规则符合进行替换,并记录当前变换次数。
这里给出java的AC代码给大家参考

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);HashMap<String, ArrayList<String>> hm = new HashMap<>();String beg = sc.next();String end = sc.next();HashSet<String> use = new HashSet<>();while (sc.hasNext()) {String a = sc.next();String b = sc.next();ArrayList<String> al = hm.get(a);if (al != null) {al.add(b);} else {ArrayList<String> te = new ArrayList<>();te.add(b);hm.put(a, te);}}Set<String> hs = hm.keySet();Queue<String> q = new LinkedList<>();q.add(beg);use.add(beg);int ci = 0;int next = 0;int now = 1;boolean flag = false;while (!q.isEmpty()) {String s = q.poll();now--;if (s.equals(end)) {flag = true;break;}for (String str : hs) {for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == str.charAt(0)) {boolean test = true;for (int j = 0; j < str.length(); j++) {if (i+j>=s.length()||s.charAt(i + j) != str.charAt(j)) {test = false;}}if (test) {ArrayList<String> re = hm.get(str);for (String string : re) {String temp = s.substring(0, i) + string + s.substring(i + str.length(), s.length());if(!use.contains(temp)) {q.add(temp);use.add(temp);next++;}}}}}}if (now <= 0) {now = next;ci++;if (ci > 10) {break;}next = 0;}}if (flag) {System.out.print(ci);} else {System.out.print("NO ANSWER!");}}
}

NOIP 2002 字串变换相关推荐

  1. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个 ...

  2. 1099 字串变换 2002年NOIP全国联赛提高组

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

  3. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  4. noip2002 字串变换 (双向宽搜,交替扩展)

    P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...

  5. P1032 字串变换(bfs)

    https://www.luogu.org/problemnew/show/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A 1-> B 1 A 2 ...

  6. 字串变换(洛谷-P1032)

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

  7. P1032 [NOIP2002 提高组] 字串变换

    展开 题目背景 本题疑似错题,不保证存在靠谱的多项式复杂度的做法.测试数据非常的水,各种做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 题目描述 已知有两个字串 A,BA,B 及一组字串 ...

  8. 洛谷P1032字串变换题解--zhengjun

    题目描述 已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则): A1A_1A1​ −-−> B1B_1B1​ A2A_2A2​ −-−> B2B_2B2​ 规则的含义 ...

  9. 【NOIP 2002】字串变换

    NOIP里的恶心题(如果不用stl的话) 然而--stl的话 就成模拟了(本来不是么--) #include <iostream> #include <cstdio> #inc ...

最新文章

  1. 4.0 C++远征:重载运算符
  2. SAP WM中阶为多个TR创建了Group后将TR从Group里删除?
  3. 「翻译」SAP零售预测和补货–简要概述
  4. 时间与字符串之间的转换
  5. BZOJ 4555 [Tjoi2016Heoi2016]求和
  6. OPENWRT挂载SWAP
  7. android TextView EditTextView一些技巧使用 (视图代码布局)
  8. java的随机数生成原理
  9. 音乐播放器的设计与实现
  10. eclipse代码量统计插件_Android Studio 代码行数统计插件Statistic的简单使用
  11. [转]Linux下用gcc/g++生成静态库和动态库(Z)
  12. sbt启动机制、配置优化及与Intellij IDEA的集成
  13. 从机器学习到深度学习
  14. les有学计算机的吗,拷问LES大涡模拟
  15. 阿里巴巴产品实习生23天
  16. 制作js原生瀑布流插件
  17. 将网页保存为图片--修改
  18. python将所有excel文档合并
  19. 《你一学就会的-思维大图》读书笔记
  20. vue项目webpack打包优化体积优化,打包体积减少200kb到4Mb

热门文章

  1. 流浪地球2真实成本多少?怎么参与?找谁参与?安全可靠吗?
  2. ubuntu下的opencv下载编译安装
  3. OMG!程序猿小哥是如何做到基金收益率高达26.03%?
  4. java求拼接后的字符串长度,java如何拼接字符串
  5. PDF转成Word或PPT后不能修改的原因和解决方法
  6. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑
  7. c语言限速编程,一种基于c语言的列车限速曲线计算方法和装置的制造方法
  8. 树莓派开机不加载桌面全屏启动chromium浏览器
  9. 适合小白的Linux入门学习教程,从安装到实操(涵盖各种常用指令,超详细!)
  10. element-ui文件上传修改上传文件的格式