首页 > 其他 > 详细

洛谷 P1032 字符变换

时间:2018-07-21 13:12:52      阅读:153      评论:0      收藏:0      [点我收藏+]

      洛谷 P1032 字符变换

题目描述

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

共进行了 3 次变换,使得 A 变换为 B 。

输入输出格式

输入格式:

输入格式如下:

A B
A1? B1?
A2? B2?     -> 变换规则

... ... /

所有字符串长度的上限为 20 。

输出格式:

输出至屏幕。格式如下:

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

输入输出样例

输入样例#1: 复制
abcd xyz
abc xu
ud y
y yz
输出样例#1: 复制
3

思路:双向广搜

技术分享图片
#include<cstring>
#include<cstdio>
#define M 100005
#define MM 55
using namespace std;
int n, add[10], xl[10], yl[10];
char q[M][MM];
char p[M][MM];
char x[10][MM], y[10][MM];

int main() {
    int i, j, k, xx, step, len;
    char jiewei;
    scanf("%s%s", q[0], p[0]);
    jiewei = p[0][strlen(p[0])];
    while(scanf("%s%s", x[n], y[n]) == 2) {
        xl[n] = strlen(x[n]), yl[n] = strlen(y[n]);
        add[n] = yl[n] - xl[n];
        n++;
    }
    if(n == 0) {  //判断两个字符串在不能变换的情况下能否相同 
        if(strcmp(q[0], p[0]) == 0) printf("0\n");
        //strcmp函数,判断两个字符串是否相同,当s1<s2时,返回为负数;当s1==s2时,返回值= 0;当s1>s2时,返回正数
        else printf("NO ANSWER!\n");
        return 0;
    }
    int l1 = 0, r1 = 0, s1 = 0;
    int l2 = 0, r2 = 0, s2 = 0;
    for(step = 1; step <= 5; step++) {
        for(i = 0; i < n; i++)
            for(j = l1; j <= r1; j++)
                for(len = strlen(q[j]), k = 0; k < len && len+add[i] < 60; k++)
                    if(strncmp(x[i], q[j]+k, xl[i]) == 0) {
                        s1++;
                        strncpy(q[s1], q[j], k);
            //strncpy函数,将字符串src中最多n个字符复制到字符数组dest中 
                        strncpy(q[s1]+k, y[i], yl[i]);
                        strncpy(q[s1]+k+yl[i], q[j]+k+xl[i], len-k-xl[i]);
                        q[s1][len+add[i]] = jiewei;
                        for(xx = l2; xx <= r2; xx++)
                            if(strcmp(p[xx], q[s1]) == 0) {
                                printf("%d\n", step+step-1);
                                return 0;
                            }
                    }
        if(s1 != r1) l1 = r1+1, r1 = s1;
        for(i = 0; i < n; i++)
            for(j = l2; j <= r2; j++)
                for(len = strlen(p[j]), k = 0; k < len && len-add[i] < 60; k++)
                    if(strncmp(y[i], p[j]+k, yl[i]) == 0) {
                        s2++;
                        strncpy(p[s2], p[j], k);
                        strncpy(p[s2]+k, x[i], xl[i]);
                        strncpy(p[s2]+k+xl[i], p[j]+k+yl[i], len-k-yl[i]);
                        p[s2][len-add[i]] = jiewei;
                        for(xx = l1; xx <= r1; xx++)
                            if(strcmp(q[xx], p[s2]) == 0) {
                                printf("%d\n", step+step);
                                return 0;
                            }
                    }
        if(s2 != r2) l2 = r2+1, r2 = s2;
    }
    printf("NO ANSWER!\n");
    return 0;
}
View Code

 



洛谷 P1032 字符变换

原文:https://www.cnblogs.com/v-vip/p/9345992.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!