青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

技術,瞎侃,健康,休閑……

mahu@cppblog 人類的全部才能無非是時間和耐心的混合物
posts - 11, comments - 13, trackbacks - 0, articles - 12
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

The Blocks Problem

Posted on 2006-06-10 01:16 mahudu@cppblog 閱讀(900) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

Background?

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?

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 \leq i < n-1$ as shown in the diagram below:
?
\begin{figure}
\centering
\setlength{\unitlength}{0.0125in} %
\begin{picture}
(2...
...raisebox{0pt}[0pt][0pt]{$\bullet
\bullet \bullet$ }}}
\end{picture}
\end{figure}
Figure: Initial Blocks World

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.

The 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.

The Output?

The output should consist of the final state of the blocks world. Each original block position numbered i ( $0 \leq 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:

Solution

#include?<stdio.h>
#define?MAXB?100?????????????????????/*?maximum?number?of?blocks?*/
????
typedef?
struct?block{
????
struct?block?*above;
????
struct?block?*below;
????
int?index;
}
?block;

block?blocks[MAXB];??????????????????
/*?storage?for?the?blocks?*/
block?
*table[MAXB];??????????????????/*?pointers?to?each?block?*/
int?numBlocks;?????????????????????????/*?the?actual?number?of?blocks?*/


void?InitBlocks()
/*?initially?table[i]?-->?blocks[i],?one?block?per?stack?*/?????
{
????
int?i;
????
for(i=0;i<numBlocks;i++){
????blocks[i].index?
=?i;
????blocks[i].above?
=?(block?*)?NULL;
????blocks[i].below?
=?(block?*)?NULL;
????table[i]?
=?&blocks[i];
????}

}



block?
*BlockTop(int?n)
/*?return?a?pointer?to?the?block?on?top?of?the?stack?in?which?block?*/
/*?n?is?located?*/?????
{
????block?
*temp?=?table[n];

????
while?(temp->above?!=?(block?*)?NULL){
????temp?
=?temp->above;
????}

????
return?temp;
}



void?ClearStackAbove(int?n)
/*?return?all?blocks?stacked?above?block?n?to?their?original?spot?*/?????
{
????block?
*top,*next;

????top?
=?BlockTop(n);
????
while?(top?!=?table[n]){??????/*?until?we?reach?block?n?*/
????next?
=?top->below;

????
/*?unlink?block?from?stack?*/
????top
->above?=?(block?*)?NULL;
????top
->below?=?(block?*)?NULL;
????
????top?
=?next;
????}

????table[n]
->above?=?(block?*)?NULL;
}


void?MoveOnto(int?n,int?k)
{
????ClearStackAbove(n);
????ClearStackAbove(k);
????table[k]
->above?=?table[n];????????/*?move?n?onto?k?*/
????
if?(table[n]->below)??????????????/*?be?safe?when?relinking?*/
????table[n]
->below->above?=?(block?*)?NULL;
????table[n]
->below?=?table[k];
}


void?PileOnto(int?n,int?k)
{
????ClearStackAbove(k);
????table[k]
->above?=?table[n];????????????/*?move?n?onto?k??*/
????
if?(table[n]->below)????????/*?be?safe?when?relinking?*/
????table[n]
->below->above?=?(block?*)?NULL;
????table[n]
->below?=?table[k];
}


int?IsOver(int?n,int?k)
/*?return?1?if?block?n?is?"over"?block?k?(same?stack),?else?0?*/?????
{
????block?
*temp;

????temp?
=?table[k];
????
while?(temp){
????
if?(temp->index?==?n)
????????
return?1;
????temp?
=?temp->above;
????}

????
return?0;
}


????
void?MoveOver(int?n,int?k)
{
????block?
*top;
????
????ClearStackAbove(n);
????top?
=?BlockTop(k);????????????/*?top?of?block?k's?stack?*/
????top
->above?=?table[n];
????
if?(table[n]->below)????????????/*?be?safe?when?relinking?*/
????table[n]
->below->above?=?(block?*)?NULL;
????table[n]
->below?=?top;
}


void?PileOver(int?n,int?k)
{
????block?
*top;
????
????top?
=?BlockTop(k);????????????/*?top?of?block?k's?stack?*/
????top
->above?=?table[n];????
????
if?(table[n]->below)????????????/*?be?safe?when?relinking?*/
????table[n]
->below->above?=?(block?*)?NULL;????
????table[n]
->below?=?top;
}


main()
{

????
char?ch;
????
int?n,k;
????block?
*bottom;
????
char?b1[10],b2[10];???????????????/*?b1?=?move/pile,?b2?=?onto/over?*/
????
char?*w1?=?&b1[0];
????
char?*w2?=?&b2[0];

????scanf(
"%d\n",&numBlocks);
????InitBlocks();
????
while?(1){
????scanf(
"%s",w1);
????
if?(w1[0]?==?'q')???/*?quit??*/
????????
break;
????scanf(
"%d?%s?%d\n",&n,w2,&k);

????
/*?is?command?a?legal?command??*/
????
if?(n?==?k?||?IsOver(k,n)?||?IsOver(n,k)){
????????
continue;
????}

????
????
switch?(w1[0]){
??????
case?'m':
????????
switch?(w2[1]){
??????????
case?'n':????/*?onto?*/
????????MoveOnto(n,k);
????????
break;
??????????
case?'v':????/*?over?*/
????????MoveOver(n,k);
????????
break;
??????????
default:
????????fprintf(stderr,
"illegal?command?%s\n",w2);
????????}

????????
break;
??????
case?'p':
????????
switch?(w2[1]){
??????????
case?'n':????/*?onto?*/
????????PileOnto(n,k);
????????
break;
??????????
case?'v':????/*?over?*/
????????PileOver(n,k);
????????
break;
??????????
default:
????????fprintf(stderr,
"illegal?command?%s\n",w2);
????????}

????????
break;
??????
default:
????????fprintf(stderr,
"illegal?command?%s\n",w2);
????}

????}


????
/*?print?stacks?*/
????
????
for(k=0;k<numBlocks;k++){
????printf(
"%2d:?",k);

????
/*?is?block?in?another?stack?,?if?so,?nothing?to?print?*/
????
????
if?(table[k]->below?!=?(block?*)?NULL){
????????printf(
"\n");
????}

????
else{
????????bottom?
=?table[k];
????????
while?(bottom){
????????printf(
"?%d",bottom->index);
????????bottom?
=?bottom->above;
????????}

????????printf(
"\n");
????}

????}

????
}

Feedback

# re: The Blocks Problem[未登錄]  回復  更多評論   

2007-05-31 16:05 by Joe
最近在做電子商務的翻譯,不知道The Blocks Problem 是什么意思?怎么這里也沒有中文解釋啊!好不郁悶!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲成人在线视频播放| 久久人人爽国产| 久久久久久久999| 亚洲男人的天堂在线| 亚洲欧美日韩国产中文在线| 亚洲专区免费| 欧美一区二区三区婷婷月色| 久久一区二区三区av| 亚洲第一页在线| 美日韩精品视频| 亚洲精品欧美在线| 亚洲欧美日韩区| 免费不卡欧美自拍视频| 欧美区高清在线| 国产欧美日韩中文字幕在线| 亚洲东热激情| 亚洲欧美日韩高清| 欧美高清视频一区二区三区在线观看 | 久久久久久久91| 免费成年人欧美视频| 亚洲日本成人| 久久午夜羞羞影院免费观看| 欧美亚男人的天堂| 亚洲第一久久影院| 午夜在线一区| 亚洲精品资源美女情侣酒店| 午夜欧美视频| 国产精品久久久久9999高清 | 欧美日韩美女| 国产一区视频在线观看免费| 一区二区国产日产| 欧美成人资源网| 久久国产精品72免费观看| 欧美日韩国产一级片| 狠狠色狠狠色综合人人| 午夜视频在线观看一区二区| 最新亚洲视频| 美女免费视频一区| 国产尤物精品| 欧美在线观看视频在线| av成人天堂| 欧美激情精品久久久六区热门 | 国产主播精品| 久久视频在线免费观看| 一区二区三区国产精华| 免费观看一区| 在线观看国产成人av片| 欧美一区二区网站| 亚洲一区二区3| 国产精品免费在线| 亚洲欧美日韩精品久久奇米色影视| 亚洲全部视频| 欧美人在线视频| 9色精品在线| 亚洲精品美女在线观看| 欧美大片国产精品| 亚洲精品美女免费| 亚洲精品视频免费在线观看| 欧美国产在线观看| 亚洲日本黄色| 亚洲人成欧美中文字幕| 欧美精品粉嫩高潮一区二区 | 亚洲日韩第九十九页| 欧美激情第六页| 欧美精品色网| 亚洲一区二区三区乱码aⅴ| 亚洲网址在线| 国产午夜亚洲精品不卡| 久久久另类综合| 久久婷婷国产综合尤物精品| 亚洲国产日韩欧美综合久久| 亚洲黄一区二区三区| 欧美日本韩国一区| 亚洲女女女同性video| 亚洲专区欧美专区| 韩国美女久久| 亚洲国产va精品久久久不卡综合| 免费欧美在线视频| 亚洲视频在线观看一区| 午夜亚洲伦理| 亚洲人成免费| 亚洲无毛电影| 黄网动漫久久久| 最近中文字幕日韩精品 | 欧美二区不卡| 亚洲欧美精品伊人久久| 欧美在线三级| 99精品热6080yy久久 | 欧美在现视频| 亚洲精品1区2区| 亚洲午夜精品17c| 在线精品亚洲| 亚洲视频在线观看网站| 激情国产一区二区| 一本色道久久综合亚洲精品不 | 欧美亚洲免费电影| 久久另类ts人妖一区二区| 亚洲精品精选| 午夜精品久久久久久久白皮肤| 亚洲大胆人体在线| 亚洲一区二区高清| 亚洲精品乱码久久久久久黑人| 亚洲在线电影| 日韩网站在线| 久久男女视频| 欧美在线视频观看| 欧美精品一区二| 久久视频一区二区| 国产精品成人久久久久| 免费亚洲电影在线| 国产精品影音先锋| 亚洲免费观看高清在线观看| 在线观看欧美| 欧美一级在线视频| 亚洲女性裸体视频| 欧美精品在线观看播放| 欧美ed2k| 激情欧美一区二区三区在线观看| 夜久久久久久| 99国产精品99久久久久久| 久久亚洲影音av资源网| 久久久99国产精品免费| 国产精品色婷婷| 一本色道久久综合狠狠躁的推荐| 99riav国产精品| 欧美精品色综合| 亚洲人成亚洲人成在线观看| 亚洲国产精品福利| 另类激情亚洲| 亚洲第一在线综合在线| 亚洲国产91色在线| 蜜桃伊人久久| 亚洲福利精品| 99精品视频免费观看| 欧美激情在线| 亚洲免费观看在线视频| 中日韩高清电影网| 欧美天天在线| 亚洲影院色在线观看免费| 欧美一区91| 一区二区三区在线高清| 玖玖综合伊人| 亚洲精品少妇| 欧美一进一出视频| 一区二区三区在线免费观看| 久久资源在线| 最近中文字幕日韩精品| 亚洲一区成人| 国产视频亚洲精品| 久久久久久久久久久久久久一区 | 艳妇臀荡乳欲伦亚洲一区| 亚洲综合三区| 国产色视频一区| 久久久久国产精品一区二区| 欧美成人久久| 99国产精品久久久久久久久久| 欧美日韩高清在线一区| 中文一区字幕| 欧美激情1区2区| 久久高清免费观看| 亚洲高清免费| 亚洲校园激情| 韩国免费一区| 欧美伦理在线观看| 亚洲欧美日韩直播| 欧美 日韩 国产在线 | 国产亚洲午夜高清国产拍精品| 久久国产精品99国产| 亚洲国产欧美一区| 欧美一区二区三区成人| 亚洲国产精品一区二区第一页| 欧美日韩免费一区二区三区视频 | 亚洲免费成人av| 久久久久九九视频| 一本色道久久综合亚洲精品不 | 韩国女主播一区| 欧美精品免费看| 久久精视频免费在线久久完整在线看 | 国产有码一区二区| 欧美日韩亚洲高清一区二区| 欧美在线观看你懂的| 亚洲精品护士| 麻豆精品网站| 欧美在线关看| 亚洲一区3d动漫同人无遮挡| 亚洲激情另类| 国内精品一区二区三区| 国产精品都在这里| 欧美日韩久久| 另类欧美日韩国产在线| 午夜精品久久一牛影视| 亚洲精品一二三| 欧美福利在线观看| 老牛国产精品一区的观看方式| 亚洲一区免费视频| 一区二区精品在线| 日韩一二在线观看| 在线播放日韩| 狠狠色丁香久久婷婷综合丁香| 国产欧美精品日韩精品|