Uva101-STL模拟

一道有点复杂的STL模拟题,对STL迭代器不太熟悉改了好久,最后总算A了出来。

感觉用数组更方便。。。但是为了练习STL嘛

对比白书上的代码,我写的还是傻了点。一开始没有理解四个操作的意思,单纯的模拟。

#include <algorithm>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>

using namespace std;

int N,M,T;
vector <int> v[30];

int getpos(int x)
{
    for(int i=0;i<N;i++)
    {
        vector <int>::iterator it = v[i].begin();
        it = find(v[i].begin(),v[i].end(),x);
        if(it != v[i].end())
        {
            return i;
        }
    }
    return -1;
}

void repose(int x,int a)
{
    for(vector<int>::iterator it = v[x].begin();it != v[x].end();++it)
    {
        if(*it == a)
        {
            if(++it == v[x].end()) return;
            for(vector<int>::iterator it2 = it;it2 != v[x].end();++it2)
            {
                int k = *it2;
                vector<int>::iterator beg = v[k].begin();
                //printf("%d %d\n",k,(int)v[k].size());
                //-    while(1);
                v[k].insert(beg,k);
            }
            v[x].erase(it,v[x].end());
            break;
        }
    }
    return;
}

void move_onto(int a,int b)
{
    int x = getpos(a),y = getpos(b);
    repose(x,a);repose(y,b);
    for(vector<int>::iterator it = v[x].begin();it != v[x].end();++it)
    {
        if(*it == a)
        {
            v[x].erase(it);
            break;
        }
    }
    for(vector<int>::iterator it = v[y].begin();it != v[y].end();++it)
    {
        if(*it == b)
        {
            v[y].push_back(a);
            break;
        }
    }
    return;
}

void move_over(int a,int b)
{
    int x = getpos(a),y = getpos(b);
    repose(x,a);
    for(vector<int>::iterator it = v[x].begin();it != v[x].end();++it)
    {
        if(*it == a)
        {
            v[x].erase(it);
            break;
        }
    }
    v[y].push_back(a);
    return;
}

void pile_over(int a,int b)
{
    int x = getpos(a),y = getpos(b);
    for(vector<int>::iterator it = v[x].begin();it != v[x].end();++it)
    {
        if(*it == a)
        {
            for(vector<int>::iterator it2 = it;it2 != v[x].end();++it2) v[y].push_back(*it2);
            v[x].erase(it,v[x].end());
            break;
        }
    }
    return;
}

void pile_onto(int a,int b)
{
    int x = getpos(a),y = getpos(b);
    repose(y,b);
    for(vector<int>::iterator it = v[x].begin();it != v[x].end();++it)
    {
        if(*it == a)
        {
            for(vector<int>::iterator it2 = it;it2 != v[x].end();++it2) v[y].push_back(*it2);
            v[x].erase(it,v[x].end());
            break;
        }
    }
    return;
}

int main()
{
    while(~scanf("%d",&N))
    {
        int a,b;
        char op[10],s[10];
        for(int i=0;i<N;i++) {v[i].clear();v[i].push_back(i);}

        while(scanf("%s",op) && op[0] != ‘q‘)
        {
            scanf("%d %s %d",&a,s,&b);
            if(getpos(a) == getpos(b)) continue;
            if(!strcmp(op,"move") && !strcmp(s,"onto")) move_onto(a,b);
            else if(!strcmp(op,"move") && !strcmp(s,"over")) move_over(a,b);
            else if(!strcmp(op,"pile") && !strcmp(s,"onto")) pile_onto(a,b);
            else if(!strcmp(op,"pile") && !strcmp(s,"over")) pile_over(a,b);
        }
        for(int i=0;i<N;i++)
        {
            printf("%d:",i);
            for(int j = 0;j < (int)v[i].size();j++) printf(" %d",v[i][j]);
            printf("\n");
        }
    }
}
时间: 2024-10-09 22:23:36

Uva101-STL模拟的相关文章

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

HDU 4022 Bombing STL 模拟题

手动模拟.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define N 10100 #define inf 1000000010 map<

stl+模拟 CCF2016 4 路径解析

1 // stl+模拟 CCF2016 4 路径解析 2 // 一开始题意理解错了.... 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 void fre() {freopen("in.txt","r",stdin);} 9 vector<string> l; 10 int main(){

【STL+模拟】UVa 506 - System Dependencies

System Dependencies  Components of computer systems often have dependencies--other components that must be installed before they will function properly. These dependencies are frequently shared by multiple components. For example, both the TELNET cli

HDU-4961 Boring Sum STL模拟

给出一个序列A,对于A里面的每个元素,左边最近的能被它整除的元素记为B序列对应位置的,右边最近的是它的整数倍的元素记为C序列对应位置,找不到的记它本身,最后算出对应位置B*C的总和. 容器模拟,按顺序扫一遍,每次如果有符合条件的取出来,即为最近的.最后把它的下标放到对应位置的容器中,然后倒序求一遍,最后求和. #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #

HDU-4841 圆桌问题 STL模拟约瑟夫问题

中文题,题意一看就是卧槽,这不约瑟夫么,然后脑子一抽就用了链表写,然后果然T了,最后用Vector模拟的约瑟夫问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <iomanip> #include <algorithm> #include <vector>

CCF 201403-3 命令行选项 (STL模拟)

问题描述 请你写一个命令行分析程序,用以分析给定的命 令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序 不用对它进行处理.在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数. 选项有两类:带参数的选项和不带参数的选项.一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b".而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求

CCF 201509-3 模板生成系统 (STL+模拟)

问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerry 时,网页的源代码是 这样的例子在包含动态内容的网站中还有很多.为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统. 模板是包含特殊标记的文本.成成用到的模板只包含一种特殊标记,格式为 {{ VAR }},其中 VAR 是一个变量.该标记在模板生成时会被变量 VAR 的值所替代.例如,如果

CCF 201403-2 窗口 (STL模拟)

问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容. 当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变.如果你点击的位置不属于任何窗口,则系统会忽略你这次点击. 现在我们希望你写一个程序模拟点击窗口的过程. 输入格式 输入的第一行有两个正整数,即 N 和 M.(

HDU5071 - Chat(STL模拟)

题目描述 略... 题解 现场赛的时候真是脑残...用splay去写..写完发现调试不出来...然后才发现数据范围才5000...不过那时候只有40分钟了..用数组模拟了速度敲了一发.写完只剩10几分钟了...最终也没调试出来..赛后想了想发现此题用deque真是巨好写.. 代码: bye是个坑.必须得在队列里并且是说过话的.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include&