POJ 1208.cpp

The Blocks Problem

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 4815   Accepted: 2043

Description

Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world in which a robot arm performed tasks involving the manipulation of blocks.
In this problem you will model a simple block world under certain
rules and constraints. Rather than determine how to achieve a specified
state, you will "program" a robotic arm to respond to a limited set of
commands.

The problem is to parse a series of commands that instruct a robot
arm in how to manipulate blocks that lie on a flat table. Initially
there are n blocks on the table (numbered from 0 to n-1) with block bi
adjacent to block bi+1 for all 0 <= i < n-1 as shown in the
diagram below:

The valid commands for the robot arm that manipulates blocks are:

move a onto b

where a and b are block numbers, puts block a onto block b after
returning any blocks that are stacked on top of blocks a and b to their
initial positions.

move a over b

where a and b are block numbers, puts block a onto the top of the
stack containing block b, after returning any blocks that are stacked on
top of block a to their initial positions.

pile a onto b

where a and b are block numbers, moves the pile of blocks consisting
of block a, and any blocks that are stacked above block a, onto block
b. All blocks on top of block b are moved to their initial positions
prior to the pile taking place. The blocks stacked above block a retain
their order when moved.

pile a over b

where a and b are block numbers, puts the pile of blocks consisting
of block a, and any blocks that are stacked above block a, onto the top
of the stack containing block b. The blocks stacked above block a retain
their original order when moved.

quit

terminates manipulations in the block world.

Any command in which a = b or in which a and b are in the same stack
of blocks is an illegal command. All illegal commands should be ignored
and should have no affect on the configuration of blocks.

Input

The
input begins with an integer n on a line by itself representing the
number of blocks in the block world. You may assume that 0 < n <
25.

The number of blocks is followed by a sequence of block commands,
one command per line. Your program should process all commands until the
quit command is encountered.

You may assume that all commands will be of the form specified above. There will be no syntactically incorrect commands.

Output

The
output should consist of the final state of the blocks world. Each
original block position numbered i ( 0 <= i < n where n is the
number of blocks) should appear followed immediately by a colon. If
there is at least a block on it, the colon must be followed by one
space, followed by a list of blocks that appear stacked in that position
with each block number separated from other block numbers by a space.
Don‘t put any trailing spaces on a line.

There should be one line of output for each block position (i.e., n
lines of output where n is the integer on the first line of input).

Sample Input

10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
quit

Sample Output

0: 0
1: 1 9 2 4
2:
3: 3
4:
5: 5 8 7 6
6:
7:
8:
9:

Source

Duke Internet Programming Contest 1990,uva 101

POJ 1208解题思路:

模拟一下就可以,每一个位置用一个栈保存这个位置上的元素,并用一个数组保存对应元素在哪个栈中;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<stack>
 7 #include<string>
 8 using namespace std;
 9
10 const int maxn=26;
11 stack<int> s[maxn];
12 int sign[maxn];
13 bool in[2];
14 int n,sta,fin;
15
16 void init()
17 {
18     for(int i=0;i<n;i++)
19     {
20         while(!s[i].empty()) s[i].pop();
21         s[i].push(i);
22         sign[i]=i;
23     }
24 }
25 void move_arm(int value)
26 {
27     int a,t=sign[value];
28     while(1){
29         a=s[t].top();
30         //printf("a:%d ",a);
31         if(a==value) break;
32         s[t].pop();
33         sign[a]=a;
34         s[a].push(a);
35     }
36 }
37 void move2()
38 {
39     int a,p1=sign[sta],p2=sign[fin];
40     stack<int> ss;
41     while(!ss.empty()) ss.pop();
42     while(1){
43               a=s[p1].top();s[p1].pop();
44               ss.push(a);
45               sign[a]=p2;
46               if(a==sta) break;
47     }
48     while(1){
49         if(ss.empty()) break;
50         a=ss.top();ss.pop();
51         s[p2].push(a);
52     }
53 }
54 void slove()
55 {
56     if(in[0]==0) move_arm(sta);
57     if(in[1]==0) move_arm(fin);
58     move2();
59 }
60 int main()
61 {
62    // freopen("in.txt","r",stdin);
63     string str;
64     while(~scanf("%d",&n)){
65         init();
66         while(1){
67             cin>>str;
68             if(str=="quit") break;
69             if(str=="move") in[0]=0;
70             else if(str=="pile") in[0]=1;
71             scanf("%d",&sta);
72             cin>>str;
73              if(str=="onto") in[1]=0;
74             else if(str=="over") in[1]=1;
75             scanf("%d",&fin);
76             if(sign[sta]==sign[fin]) {continue;}
77             slove();
78         }
79         stack<int>ss;
80         for(int i=0;i<n;i++)
81         {
82             while(!ss.empty()) ss.pop();
83             while(!s[i].empty()) {int a=s[i].top();s[i].pop();ss.push(a);}
84            printf("%d:",i);
85             while(!ss.empty()){printf(" %d",ss.top());ss.pop();}
86             printf("\n");
87         }
88     }
89     return 0;
90 }
时间: 2024-10-02 18:34:03

POJ 1208.cpp的相关文章

poj 1208 The Blocks Problem 模拟+vector的使用

模拟水题,直接贴代码,主要是vector的使用. //poj 1208 //sep9 #include <iostream> #include <vector> using namespace std; const int maxN=32; vector<int> v[maxN],tmp; char a[32],b[32]; int n,x,y,a1,a2,b1,b2; void get_address() { int i,j; for(i=0;i<n;++i)

POJ 1208 The Blocks Problem

The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5397   Accepted: 2312 Description Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of

POJ 1191.cpp

棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12698   Accepted: 4503 Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和.现在需要把棋盘按上述规

poj 3320 Jessica&#39;s Reading Problem (尺取法)

Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8787   Accepted: 2824 Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is coming, yet she has spent littl

POJ 2253 - Frogger (floyd)

A - Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to

poj 2299 Ultra-QuickSort (树状数组+离散化)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 48257   Accepted: 17610 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

poj 2566 Bound Found (前缀和,尺取法(two pointer))

Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2010   Accepted: 659   Special Judge Description Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration

poj 2159 Ancient Cipher(水)

Ancient Cipher Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30695   Accepted: 10023 Description Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents w

DLX (poj 3074)

题目:Sudoku 匪夷所思的方法,匪夷所思的速度!!! https://github.com/ttlast/ACM/blob/master/Dancing%20Link%20DLX/poj%203074.cpp #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int inf = 100000000; int flag; typedef long lo