101:The Blocks Problem

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;
}


posted @ 2018-04-15 17:11  ACLJW  阅读(113)  评论(0编辑  收藏  举报