POJ 1208 模拟

2017-08-28 15:07:16

writer:pprp

好开心,这道题本来在集训的时候做了很长很长时间,但是还是没有做出来,但是这次的话,只花了两个小时就做出来了

好开心,这次采用的是仔细分析需要的函数,写一个函数就将这个函数进行测试,所以效率比较高

这次竟然提交了一次直接AC了,hhhh


我想总结一下这种做题感觉,一直认为自己实现功能的能力比较弱,虽然这是事实,但是没有想象中那么弱,其实还是可以实现很大一部分的内容

之后只要方法对了,然后可以坚持下去,那我就很大几率成功,昨天看视频的时候看到一个很厉害的人他说他身边有的高中同学在大学期间,只用了一年

时间,就将全国金牌拿到手了,并且那个人并不是很聪明,但是他十分努力。所以说我还是有希望的,经过长时间的训练和锻炼是可以达到很高的提升的;

以后做题还是要坚持1、计时  2、审题认真仔细,找到容易忽略的地方,以及特殊情况  3、模块化编程,边编边测试


代码以及详细讲解如下:

/*
@theme:poj 1208
@writer:pprp
@start:11:00-12:00
@end:14:41-13:06
@declare:写一个恶心的模拟题目,
经过抽象,得到两个操作,模拟样例的操作的时候,
可以看出几个特殊情况,如果将a和a上的箱子一起放到b箱上,那么如果b就是a上的箱子,那么不进行操作
注意这个是面向箱子的不是面向位置的
而且发现有两个函数需要构造出来
1、查找函数Find,找到某个箱子的位置,横纵坐标
2、进行输出操作Out,这个还有利于检查
@date:2017/8/28
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#define tag cout << " *** " << endl

using namespace std;
int n;

deque<int> dq[25];
bool Find(deque<int> dq[], int key,int&x, int&y);

//操作1:将某箱子上边所有的箱子放回原位
//@param:x, x是箱子x
//test successfully
void resend(int a)
{
    int x, y;
    Find(dq,a,x,y);
    for(int i = (int)dq[x].size()-1 ; i > y ; i--)
    {
        int tmp = dq[x].back();
        dq[tmp].push_back(tmp);
        dq[x].pop_back();
    }
    return;
}


//操作2:将某个箱子和箱子以上的箱子都移动到指定箱子的最上方--ok?
//a到b的上方
void transe(int a, int b)
{
    int ax, ay, bx, by;
    Find(dq,a,ax, ay);
    Find(dq,b,bx, by);
    //如果将a和a上的箱子一起放到b箱上,那么如果b就是a上的箱子,那么不进行操作
    if(ax == bx)
        return;

    int ak[25];
    int len = dq[ax].size() - ay ;
    for(int i = 0 ; i < len ; i++)
    {
        ak[i] = dq[ax].back();
        dq[ax].pop_back();
    }

    for(int i = len - 1; i >=0 ; i--)
    {
        dq[bx].push_back(ak[i]);
    }
    return;
}

//操作3:输出操作 -- ok
void Out()
{
    for(int i = 0 ; i < n ; i++)
    {
        cout << i << ": " ;
        for(int j = 0 ; j < (int)dq[i].size(); j++)
        {
            cout << dq[i][j] << " ";
        }
        cout << endl;
    }
}

//操作4:查找操作 -- ok
bool Find(deque<int> dq[], int key,int&x, int&y)
{
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < (int)dq[i].size(); j++)
        {
            if(key == dq[i][j])
            {
                x = i;
                y = j;
                return true;
            }
        }
    }
    return false;
}
//操作5:初始化 -- ok
void init()
{
    for(int i = 0 ; i < n ; i++)
    {
        dq[i].push_back(i);
    }
    return ;
}

int main()
{
    cin >> n;
    init();

//    Out();
//    dq[8].pop_back();
//    dq[1].push_back(8);
//    dq[7].pop_back();
//    dq[1].push_back(7);
//    dq[3].pop_back();
//    dq[4].push_back(3);
//    dq[5].pop_back();
//    dq[4].push_back(5);
//    Out();

    char line[100];
    char ch1[10],ch2[10];
    int a = 0, b = 0;

//    while(cin >> a >> b)
//    {
//         transe(a,b);
//         Out();
//    }
    while(gets(line))
    {
        if(strcmp(line,"quit") == 0 )
            break;
        sscanf(line,"%s %d %s %d",ch1,&a,ch2,&b);
        if(strcmp(ch1,"move") == 0)
        {
            if(strcmp(ch2,"over") == 0)//move a over b
            {
                resend(a);
                transe(a,b);
            }
            else //move a onto b
            {
                resend(a);
                resend(b);
                transe(a,b);
            }
        }
        else
        {
            if(strcmp(ch2,"over") == 0) //pile a over b
            {
                transe(a,b);
            }
            else //pile a onto b
            {
                resend(b);
                transe(a,b);
            }
        }
    }
    Out();
    return 0;
}

 

转载于:https://www.cnblogs.com/pprp/p/7443977.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值