ShellSort UVA 10152

说说:

题意大概就是开始有一堆的字符串堆栈A,其中的任何一个字符串都可以从当前位置移动到栈顶,经过若干字符串的移动,最后形成了另一个字符串堆栈B,要求输出按顺序输出移动字符串最少的移动方案。其实解法挺简单的,既然要求的是最少的移动,那么就从B的底部开始逐个在A中从底部往上查找,并且要在A中标记查找位置,因为A中已经被查找过的字符串必然是要移动的。如此重复,直到B在原堆栈中找不到可以不移动的字符串。最后,B中剩下的都是移动过的字符串。因为字符串只能移动到顶部,因此从B中的当前位置逐个向顶部输出字符串,就是所求的结果啦。

源代码:

#include <stdio.h>
#include <string.h>
#define MAXN 200+5
#define MAXL 80+5

int main(){
   char origin[MAXN][MAXL],now[MAXN][MAXL];
   int T,n,i,p;
//   freopen("data","r",stdin);
   scanf("%d",&T);
   while(T--){
     scanf("%d\n",&n);
     for(i=0;i<n;i++)
      gets(origin[i]);
     for(i=0;i<n;i++)
      gets(now[i]);

     for(i=p=n-1;i>=0&&p>=0;){//p标记原堆栈的位置,i标记当前堆栈的位置
      while(p>=0)
        if(strcmp(now[i],origin[p])==0){
	  p--;
	  i--;//i的递减最好放在内部,否则可能会少输出一个字符串
	  break;
	}
	else
	  p--;
     }

     for(;i>=0;i--)
      printf("%s\n",now[i]);

     putchar('\n');
   }

   return 0;
}
时间: 2024-11-10 18:05:44

ShellSort UVA 10152的相关文章

UVa 10152 - ShellSort 题解

按他的方法排序,每次移动一个数到顶点,排成需要的序列. Problem D: ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle stack. And then Yertle climbed up. He sat down on the pile. What a wonderful view! He could see 'most a mile! T

UVa 10152 龟壳排序

思路:先读入的一列是原始串,后读入的一列是目标串.最少操作次数的方式是,从下到上,只对原始串进行删除而不放到最上面能得到的目标串的以最下元素开头的最长子串,然后将目标串剩余的那些按序放在最上方,即按由下到上的顺序输出即可. Code: //#define LOCAL #include<stdio.h> #include<stdlib.h> #include<string.h> char name[210][90]; char target[210][90]; //cha

ShellSort uva

ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle stack. And then Yertle climbed up. He sat down on the pile. What a wonderful view! He could see 'most a mile! The Problem King Yertle wishes to rearra

UVa 10152 - ShellSort

题目:给你一个现有字符串的序列,以及一个目标字符串的序列,每次操作可以把一个单词置顶, 问把当前串变成目标串,要操作几次. 分析:排序.因为每次可以使一个单词置顶,所以每个单词最多移动一次就可以变为目标串. 从后向前找到每个目标串元素对应元素的当前串位置(每个只能在"上一个"之前): 能找到的元素个数,就是不需要改动的个数,其他均要移动,对应目标串中剩余的元素: 剩余的目标串倒序输出,即为操作顺序. 定义两个指针分别从两串序列的尾部向头部移动,如果匹配成功同时前进: 不成功,当前传指针

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

UVA ShellSort

题目如下: Problem D: ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle stack. And then Yertle climbed up. He sat down on the pile. What a wonderful view! He could see 'most a mile! The Problem King Yertle

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te