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

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

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>
            亚洲电影在线播放| 亚洲欧美制服中文字幕| 欧美激情精品久久久久久黑人| 国产亚洲欧美激情| 欧美精品1区2区3区| 欧美在线电影| 亚洲在线观看免费视频| 亚洲激情在线激情| 久久精品国产欧美亚洲人人爽| 亚洲伦理一区| 中国成人黄色视屏| 亚洲综合电影一区二区三区| 日韩亚洲欧美成人| 这里只有精品视频在线| aⅴ色国产欧美| 欧美一区二区三区免费观看| 久久狠狠亚洲综合| 久久综合九色| 亚洲精品日韩在线观看| 亚洲免费久久| 午夜精品久久久久久久久久久久| 亚洲欧美在线高清| 亚洲欧美日韩综合aⅴ视频| 亚洲精品在线观看免费| 亚洲欧美三级伦理| 欧美fxxxxxx另类| 亚洲精品影院| 午夜视频在线观看一区二区三区| 亚洲一区二区高清视频| 一区在线免费| 一二三四社区欧美黄| 欧美资源在线| 91久久午夜| 久久精品国产91精品亚洲| 欧美成人免费视频| 国产久一道中文一区| 亚洲福利视频免费观看| 亚洲欧美另类在线观看| 欧美 日韩 国产一区二区在线视频 | 一区二区三区视频观看| 久久天天狠狠| 国模大胆一区二区三区| 亚洲在线免费观看| av不卡免费看| 国产精品vvv| 亚洲老司机av| 日韩视频在线观看| 欧美日韩国内自拍| 国产精品99久久久久久白浆小说| 久久国产精品99国产精| 亚洲一区www| 国产精品久久国产三级国电话系列| 久久激情婷婷| 在线日韩av永久免费观看| 久热精品视频在线免费观看| 亚洲人成在线影院| 亚洲日本视频| 国产精品久久久久久久午夜| 亚洲综合精品自拍| 欧美在线999| 国产精品99久久久久久久久久久久 | 玖玖玖国产精品| 一区二区三区日韩精品| 一本久久a久久精品亚洲| 136国产福利精品导航网址| 99riav国产精品| 一区二区视频欧美| 国产精品99久久久久久久久 | 久久久综合香蕉尹人综合网| 99精品久久久| 久久精品理论片| 欧美专区第一页| 欧美日韩在线免费| 欧美黄色精品| 在线观看一区视频| 久久一区二区三区四区五区| 午夜日本精品| 欧美午夜久久| 亚洲一区二三| 亚洲专区在线视频| 欧美高清在线播放| 亚洲国产欧美一区| 亚洲裸体视频| 亚洲性图久久| 亚洲欧洲av一区二区| 欧美亚洲视频| 午夜精品影院| 国产精品免费观看在线| 欧美高清在线视频| 永久域名在线精品| 欧美国产一区二区| 欧美激情亚洲激情| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩成人在线观看| 欧美插天视频在线播放| 亚洲国产mv| 欧美日韩精品免费观看| 亚洲一级在线观看| 老司机成人网| 亚洲在线一区二区| 曰韩精品一区二区| 欧美日韩日日夜夜| 久久久久久久精| 夜夜狂射影院欧美极品| 免费久久99精品国产自在现线 | 亚洲精品欧洲| 欧美日韩视频在线| 亚洲一区二区av电影| 亚洲国产成人在线播放| 久久精品中文字幕一区二区三区 | 欧美国产亚洲视频| 欧美一区二区视频在线观看2020| 国产欧美日韩亚洲精品| 免费亚洲一区二区| 欧美亚洲一区| 久久国产福利| 中文日韩在线| 亚洲欧美在线aaa| 亚洲综合电影| 欧美一区观看| 久久嫩草精品久久久久| 免费观看国产成人| 欧美国内亚洲| 国产精品成人一区二区三区吃奶| 欧美日韩精品二区| 欧美日韩综合在线免费观看| 欧美日韩国产一级片| 欧美日韩久久久久久| 国产精品欧美日韩一区| 国产一区二区三区久久久久久久久| 国产精品一区二区欧美| 国产欧美日韩在线| 欧美aaaaaaaa牛牛影院| 欧美韩日一区| 欧美一级在线视频| 老司机午夜精品视频在线观看| 久久夜色精品国产欧美乱极品| 欧美成人中文字幕在线| 欧美成人午夜激情| 精品91在线| 午夜一区二区三区在线观看| 久久久久久久久久久久久女国产乱| 免费观看亚洲视频大全| 日韩一二三区视频| 久久久亚洲成人| 国产精品你懂的在线| 亚洲精品一区二区在线| 欧美自拍偷拍午夜视频| 亚洲人成在线播放| 亚洲欧美日韩综合国产aⅴ| 亚洲成人在线视频播放 | 欧美系列电影免费观看| 国产一区二区日韩| 亚洲久久一区| 亚洲精品一二三| 欧美成人第一页| 亚洲国产精品成人精品| 亚洲人成网在线播放| 欧美精品一区二区高清在线观看| 欧美高清视频| 亚洲黄色影院| 欧美三级中文字幕在线观看| 亚洲裸体视频| 国产精品成人在线观看| 在线视频精品一| 久久精品国产清自在天天线| 国产一区导航| 免费美女久久99| 一本大道久久a久久精二百| 亚洲视频在线观看网站| 国产精品一区视频网站| 葵司免费一区二区三区四区五区| 亚洲精品乱码久久久久久蜜桃麻豆| 一级成人国产| 狠狠狠色丁香婷婷综合激情| 欧美电影在线| 亚洲男人av电影| 亚洲高清资源| 亚洲欧美日韩国产综合在线| 国内精品久久久久影院优| 99在线精品视频在线观看| 国产一区二区0| 欧美日韩国产成人在线免费 | 亚洲午夜av| 欧美 日韩 国产精品免费观看| 一区二区三区精密机械公司| 国产在线精品二区| 欧美激情网友自拍| 欧美一区国产在线| 夜夜嗨网站十八久久| 欧美大片91| 久久精品国产69国产精品亚洲| 亚洲精品国产系列| 国产三级精品三级| 欧美日韩一区二区三区视频| 美女被久久久| 久久久久欧美| 久久精品国产一区二区电影| 日韩一区二区电影网| 亚洲大片精品永久免费|