【NOIP2002】【codevs 1099】字串变换

121人阅读 评论(0) 收藏 举报
分类:

1099 字串变换 2002年NOIP全国联赛提高组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
已知有两个字串 A,B 及一组字串变换的规则(至多6个规则):
     A1>B1
     A2>B2
  规则的含义为:在 A$中的子串 A1B1、A2B2 …。
    例如:AabcdB=’xyz’
  变换规则为:
    ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’

  则此时,AB,其变换的过程为:
   ‘abcd’->‘xud’->‘xy’->‘xyz’

  共进行了三次变换,使得 AB

输入描述 Input Description
输入格式如下:

   AB
   A1B1 \
   A2B2 |-> 变换规则
   … … /
  所有字符串长度的上限为 20。

输出描述 Output Description
若在 10 步(包含 10步)以内能将 AB ,则输出最少的变换步数;否则输出”NO ANSWER!”

样例输入 Sample Input
abcd xyz
abc xu
ud y
y yz

样例输出 Sample Output
3

数据范围及提示 Data Size & Hint
hehe

并没有写双向搜索之类的东西
感谢强大的STL

compare 比较
replace 替换

就每次暴力看是不是相同 相同就换 顺便记个已经换了多少次
注意判环 所以要>10就退出

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
using namespace std;
const int MAXN = 205;
int cnt = 0,ans = 0;
map <string,bool> used;
string mm[MAXN][2];//输入们 
struct edge{
    string s;
    int step;
};//当前串 变化步数 
queue < edge > q;

bool dms(string s){
    q.push((edge){mm[0][0],0});
    while(!q.empty()){
        edge u = q.front();q.pop();
        if(u.s == mm[0][1]) {ans = u.step;return true;}
        int len = u.s.length();

        for(int i = 0; i < len; i ++)
            for(int j = 1; j <= cnt; j ++){
                edge w = u;
                if(!u.s.compare(i,mm[j][0].length(),mm[j][0])){
                    w.s.replace(i,mm[j][0].length(),mm[j][1]),w.step ++;
                    if(used[w.s]) continue;
                    if(w.step <= 10) q.push(w);
                    used[w.s] = true;
                }
            }
    }
    return false;
}

int main(){
    cin >> mm[cnt][0] >> mm[cnt][1],cnt ++;//起点和终点 
    while(cin >> mm[cnt][0] >> mm[cnt][1])  cnt ++;
    if(dms(mm[cnt][0])) printf("%d\n",ans);
    else puts("NO ANSWER!");//注意输出!!!!!!!! 
    return 0;
}
查看评论

【NOIP2002】字串变换 -宽搜

问题 F(1209): 【NOIP2002】字串变换 时间限制: 1 Sec 内存限制: 64 MB 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> ...
  • yuanxinyu402
  • yuanxinyu402
  • 2016-01-30 10:45:36
  • 457

NOIP 2002字串变换 解题报告(双向宽搜)

在线评测: http://codevs.cn/problem/1099/ 整体思路: 双向宽搜,, 失误之处: 1、对于一个坚持从1开始循环的人,,字符串的0开始多么的不友好,...
  • qq_35772697
  • qq_35772697
  • 2016-08-22 10:42:13
  • 504

双向BFS—>NOIP2002 字串变换

如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展。 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索...
  • txl16211
  • txl16211
  • 2015-09-17 21:01:20
  • 779

【NOIP 2002】字串变换

NOIP里的恶心题(如果不用stl的话) 然而——stl的话 就成模拟了(本来不是么……)#include #include #include #include #include #in...
  • LOI_xczhw
  • LOI_xczhw
  • 2015-10-22 17:04:41
  • 705

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

P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一...
  • yuyanggo
  • yuyanggo
  • 2015-08-28 19:08:00
  • 1496

【洛谷 1032】 字串变换

很好的bfs的题,实现写的比较麻烦,但感觉不错,思路很清晰,适合考试。 #include using namespace std; int cnt=1; bool flag=0; stri...
  • yhf_2015
  • yhf_2015
  • 2016-09-21 09:12:21
  • 375

codevs1099 字串变换 string黑科技+队列

题目链接 : 戳我好歹也是2002年NOIP全国联赛提高组,开始不知道string黑科技,打起来恶心的要死……后来知道了黑科技,打起来真是快,T起来也真是快,不过对于当年数据还是可以的。题目一看,好难...
  • Loi_Seavot
  • Loi_Seavot
  • 2015-10-09 14:30:01
  • 916

【codevs 1099】字串变换

题目描述 Description 已知有两个字串 A,B, B 及一组字串变换的规则(至多6个规则):      A1−>B1 -> B1      A2−>B2 -> B2   规则的含义为...
  • Hall_Of_Fame_
  • Hall_Of_Fame_
  • 2017-10-23 11:28:45
  • 73

CodeVS 1099 字串变换 题解

恩……正常来说第42行代码和第65行代码应该删去…… 但是被逼无奈…… 为了应对一组特殊数据耍了一点小聪明…… 但是呢,没有失大体,不是那种针对输入数据打表骗分…… 而是针对某组数据进行的剪枝...
  • AnHongjun
  • AnHongjun
  • 2017-07-19 22:58:13
  • 137

NOIP2002 字串变换

题二 字串变换 (存盘名: NOIPG2) [问题描述]:   已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则):      A1$ -> B1$      A2$ -> B...
  • hahalidaxin
  • hahalidaxin
  • 2016-03-30 17:23:31
  • 137
    个人资料
    等级:
    访问量: 7万+
    积分: 2881
    排名: 1万+
    %%%