UVA 10152 ShellSort

题目

龟壳排序

分析

  1. 标题党,与希尔排序无关;
  2. 给出两组龟壳,一组初始序列,一组目标序列。要求对初始序列排序,达到目标序列,排序规则要求一次仅能把某龟壳移至顶部。依次输出移动的龟壳的名字。

思路

  1. 逆向思考,如何把目标序列滚回初始序列,举一个栗子。

    Y R S D E M Z F W -> Y D S E M R Z F W
    (Y) (R) (S) D E M Z F W -> () D () E M () Z F W
    S -> ^ E
    R -> ^ Z
    Y -> ^ D

  2. 也就是说,先用目标序列在初始序列找到相对位置最长的子串(即目标序列两个字符间可以插入非匹配字符),目标序列剩下未匹配的字符即是初始序列需要移动的字符。

代码

#include <cstdio>
#include <cstring>

int main()
{
    int k, n, i, j;
    char a[205][85], b[205][85];
    scanf("%d\n", &k);
    while (k--) {
        scanf("%d\n", &n);
        for (i = 0; i < n; i++) fgets(a[i], 85, stdin);
        for (i = 0; i < n; i++) fgets(b[i], 85, stdin);
        for (i = j = n-1; i >= 0; i--) if (strcmp(b[j], a[i]) == 0) j--;
        for (; j >= 0; j--) printf("%s", b[j]);
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值