Uva 10152 ShellSort

简介: 点击打开链接 题目意思:有一堆的乌龟,输出一堆乱序的乌龟,然后输入一个正确的顺序,要求找到一种最小步骤的方法使得第一堆变成第二堆,每一次可以把乌龟移到第一个位置,输出该方法步骤.

点击打开链接


题目意思:有一堆的乌龟,输出一堆乱序的乌龟,然后输入一个正确的顺序,要求找到一种最小步骤的方法使得第一堆变成第二堆,每一次可以把乌龟移到第一个位置,输出该方法步骤.


解题思路:我们可以用两个char 数组来存储第一和第二堆的乌龟顺序,然后用两个int 数组num和tem来存储乌龟的顺序编号.我们知道只要从后面往前遍历tem数组就可以找到最小的步骤,然后利用栈的先进后出的性质(由上面可知,乌龟最后一个肯定是最先移动的)


代码:

//UVA10152
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <map>
#include <algorithm>
using namespace std;

char ch[210][100] , temp[210][100];
int  num[210] , tem[210];

void output(int n){
    int i , j;
    memset(tem , 0 ,sizeof(tem));
    for(i = 0 ; i < n ;i++){
        for(j = 0 ; j < n ; j++){
            if(strcmp(temp[i] , ch[j]) == 0)
                tem[i] = num[j];
        }
    }
    for(i = n-2 ;i >= 0 ; i--){
        if(tem[i] > tem[i+1])
            break;
    }
    stack<char*>s;
    for(j = 0 ;j <= i ;j++)
        s.push(temp[j]);
    while(!s.empty()){
        cout<<s.top()<<endl;
        s.pop();
    }
    cout<<endl;
}
int main(){
    int t , n , i , j;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        getchar();
        memset(num , 0 , sizeof(num));
        for(i = 0 ;i < n ; i++){
            gets(ch[i]);
            num[i] = i;
        }
        for(i = 0 ; i < n ; i++){
            gets(temp[i]);
        }
        output(n);
    }
    return 0;
}



目录
相关文章
概率dp - UVA 11021 Tribles
Tribles  Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059   Mean:  有k个细菌,每个细菌只能存活一天,在死去之前可能会分裂出0,1,2....n-1个细菌,对应的概率为p0,p1,p2....pn-1。
827 0
|
机器学习/深度学习
uva 12470 Tribonacci
点击打开uva12470  思路: 矩阵快速幂 分析: 1 裸题 代码: /************************************************ * By: chenguolin ...
990 0
|
JavaScript 定位技术
uva 10047 - The Monocycle
点击打开链接uva 10047 思路:bfs 分析: 1 题目给定一个起始的状态然后要求是否可以到达目标状态 2 这些状态包括了位置,方向,底面颜色。
850 0
uva 10730 - Antiarithmetic?
点击打开链接uva 10730 思路:枚举等差中项 分析: 1 给定一个n个数的序列判断是否有等差子序列 2 很明显我们如果要判断是否有等差子序列的话,只要去判断是否有长度为3的等差子序列 3 对于n
843 0
|
Python 人工智能 资源调度
UVA11525
题意:给定N与K(均为正整数)可以确定第K个全排列(1..N的全排列),但N较大,现以N=sigma(Si×(K-i)!)(i=1..K)的形式,输入K以及Si,i=1..K,请输出第K个全排列 分析:逆向去想,对于一个给定的全排列可以确定它的序号K,K的表达式形式与N类似,发现从Si可以确定第K个全排列中的第i项,具体用线段树实现查找第i项即可。
606 0
|
BI
uva11729
题意:有n个人需要你分配任务,交代任务需要bi时间,执行任务需要ji时间,要求最早完成任务,请输出最后完成对的工作的时间。类型:贪心(先排序再处理)代码: #include #include #include #include using namespace std; int m...
711 0
UVA11437
题目: In the picture below you can see a triangle ABC. Point D, E and F divides the sides BC, CA and AB into ratio 1:2 respectively.
722 0
UVA11991
给出一个包含n个整数的数组,每次询问两个整数k和v,输出从左到右第k个v的下标(从1到n) 白书指导书的例题。。不过可以写的更短一点: #include #include #include #include using namespace std; mapa; int m...
595 0