101:The Blocks Problem

原创 2018年04月15日 17:11:15

The Blocks Problem


其实四条命令可以简化为两个操作:

1. 把某个块上面的块放回原位;

2. 把某个块及其上的块放到另一个块所在的堆顶。

还可以加一个数组保存每个块的所在的堆,这样写出来的代码比书上还间接哈哈哈。

第一次WA是多输出了换行,第二次是以为有多组数据,代码如下:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 30;
int n,pos[maxn];
char cmd[20];
vector<int>bk[maxn];
void ret(int a,int pa){
    for(int i = bk[pa].size() - 1;bk[pa][i] != a;i--){
        int t = bk[pa][i];
        bk[t].push_back(t);
        pos[t] = t;
        bk[pa].pop_back();
    }
}
void put(int a,int pa,int pb){
    int i = 0;
    while(bk[pa][i] != a) i++;
    for(int j = i;j < bk[pa].size();j++){
        int t = bk[pa][j];
        bk[pb].push_back(t);
        pos[t] = pb;
    }
    for(int j = bk[pa].size() - 1;j >= i;j--) bk[pa].pop_back();
}
int main(){
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        bk[i].push_back(i);
        pos[i] = i;
    }
    while(fgets(cmd,15,stdin) && cmd[0] != 'q'){
        int a = cmd[5] - '0',b = cmd[12] - '0';
        if(a == b || pos[a] == pos[b]) continue;
        if(cmd[0] == 'm') ret(a,pos[a]);
        if(cmd[8] == 'n') ret(b,pos[b]);
        put(a,pos[a],pos[b]);
    }
    for(int i = 0;i < n;i++){
        printf("%d:",i);
        for(int j = 0;j < bk[i].size();j++) printf(" %d",bk[i][j]);
        putchar('\n');
    }
    return 0;
}

然而还是WA了,最后发现是读取数据的问题,我是把一条命令全部读到一个字符串里面,还觉得我这比他们的更简洁哈哈哈,没想到两位数。。。下面是AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 30;
int n,a,b,pos[maxn];
char cmd1[5],cmd2[5];
vector<int>bk[maxn];
void ret(int a,int pa){
    for(int i = bk[pa].size() - 1;bk[pa][i] != a;i--){
        int t = bk[pa][i];
        bk[t].push_back(t);
        pos[t] = t;
        bk[pa].pop_back();
    }
}
void put(int a,int pa,int pb){
    int i = 0;
    while(bk[pa][i] != a) i++;
    for(int j = i;j < bk[pa].size();j++){
        int t = bk[pa][j];
        bk[pb].push_back(t);
        pos[t] = pb;
    }
    for(int j = bk[pa].size() - 1;j >= i;j--) bk[pa].pop_back();
}
int main(){
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        bk[i].push_back(i);
        pos[i] = i;
    }
    while(scanf("%s%d%s%d",cmd1,&a,cmd2,&b) == 4){
        if(a == b || pos[a] == pos[b]) continue;
        if(cmd1[0] == 'm') ret(a,pos[a]);
        if(cmd2[1] == 'n') ret(b,pos[b]);
        put(a,pos[a],pos[b]);
    }
    for(int i = 0;i < n;i++){
        printf("%d:",i);
        for(int j = 0;j < bk[i].size();j++) printf(" %d",bk[i][j]);
        putchar('\n');
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37754288/article/details/79950673

UVA101The Blocks Problem(小模拟+STL)

B - The Blocks Problem Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm...
  • zyd8888102
  • zyd8888102
  • 2016-07-20 20:49:39
  • 656

UVA101 The Blocks Problem

思路就是用栈来模拟,一开始就是n个栈。每个栈里都是一个元素,然后按照指令移,在这个栈里pop()掉它,在另一个栈里push()进去。。 分四种情况来做移动,每种情况处理方式不一样。要注意如果是一堆移过...
  • yeyeyeguoguo
  • yeyeyeguoguo
  • 2014-07-21 14:42:10
  • 810

uva101木块问题The Blocks Problem

背景:一看这道题,再看书前面的知识点,我只能说一点不会,于是我将上面的代码在电脑上面打了一遍,这才会一点点新知识的运用,然后我就按照自己的想法,说实话已经参照了书上的一些东西,然后自己去用新知识写代码...
  • qiweigo
  • qiweigo
  • 2015-02-06 10:20:34
  • 839

《算法竞赛入门经典2ndEdition 》例题5-2 木块问题(The Blocks Problem, Uva101)

这题感觉还不错,很好的练习了vector,也非常考察细心。我之前提交WA原因是因为我傻傻的以为a和b都是1位数,于是用了一个getline() 然后通过第几位的数字来读,后来看了标程之后突然恍然大悟,...
  • OccupiedCSDN
  • OccupiedCSDN
  • 2015-12-25 21:51:55
  • 436

uva-101 && poj 1208 The Blocks Problem (模拟栈)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18191 题意:   下面的步骤看别人的, 機器手臂有以下幾種合法搬積木的方式...
  • u012773338
  • u012773338
  • 2014-11-13 23:04:56
  • 528

例题5-2 UVA 101 The Blocks Problems 木块问题

看了看紫书上代码分析:收获不少! 解这个题用到了Vector类(非常巧妙简单): 整体思路:定义一耳光Vector容器:vectorpile[maxn];这样pile算是一个二维数组,一维是确定的...
  • aozil_yang
  • aozil_yang
  • 2015-12-15 15:51:39
  • 391

C++ 不定长数组vector 例5-2木块问题(The Blocks Problem,UVa 101)

vector就是一个不定长数组。不仅如此,它把一些常用的操作“封装”在了vector类型内部。 若a是一个vector,可以用以下语句直接对vector进行操作 a.size() a...
  • zhaohaibo_
  • zhaohaibo_
  • 2018-02-03 16:44:43
  • 38

uva 101 木块问题 The Blocks Problem

题目描述: Description Background  Many areas of Computer Science use simple, abstract domains for ...
  • qq_35323001
  • qq_35323001
  • 2016-10-17 21:27:56
  • 549

Uva 101 the block problem 木块问题(算法竞赛经典入门)STL vector

Uva 101 the block problem 木块问题 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四...
  • glrh123
  • glrh123
  • 2015-05-06 17:04:49
  • 2553

uva 101 The Blocks Problem

模拟题目,考验写代码的耐心了,代码有点长但是含金量不高,堆栈和键值对的应用 #include #include #include #include using namespace std...
  • xiaohaowudi
  • xiaohaowudi
  • 2013-10-01 15:35:19
  • 361
收藏助手
不良信息举报
您举报文章:101:The Blocks Problem
举报原因:
原因补充:

(最多只允许输入30个字)