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

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

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

The Blocks Problem

Posted on 2006-06-10 01:16 mahudu@cppblog 閱讀(904) 評論(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>
            欧美日韩黄色大片| 欧美日韩国产欧美日美国产精品| 经典三级久久| 国产精品久久久久免费a∨ | 久热精品视频在线| 午夜精品偷拍| 午夜亚洲福利| 久久精品人人| 久久性天堂网| 欧美激情第8页| 欧美激情视频一区二区三区免费| 欧美国产日产韩国视频| 欧美久久久久久久久| 欧美日韩在线综合| 亚洲一区二区三区在线视频| 亚洲欧美日韩在线不卡| 亚洲欧美日韩网| 午夜一区二区三区在线观看 | 国产精品久久二区| 国产精品久久久久99| 国产精品视频精品| 伊人成人在线| 性久久久久久| 鲁大师影院一区二区三区| 美女脱光内衣内裤视频久久影院 | 久久国内精品视频| 欧美mv日韩mv国产网站app| 国产精品wwwwww| 欧美性猛交xxxx免费看久久久| 亚洲欧美经典视频| 久久久久久久精| 欧美成人资源网| 日韩视频在线免费| 欧美有码视频| 欧美人与性动交α欧美精品济南到 | 久久久久久亚洲综合影院红桃 | 亚洲素人一区二区| 欧美与黑人午夜性猛交久久久| 欧美福利视频一区| 亚洲美女免费视频| 在线欧美日韩| 精品91视频| 国产日本欧美一区二区| 亚洲激情一区| 久久高清国产| 在线午夜精品自拍| 久热综合在线亚洲精品| 国产乱码精品1区2区3区| 亚洲人在线视频| 亚洲欧美成人精品| 亚洲国产综合91精品麻豆| 国模精品一区二区三区色天香| 国产精品丝袜久久久久久app| 日韩视频一区二区三区在线播放| 久久人91精品久久久久久不卡 | 亚洲黄色成人网| 亚洲区中文字幕| 欧美日韩国产大片| 日韩小视频在线观看专区| 久久天堂国产精品| 午夜激情亚洲| 国产欧美日韩精品丝袜高跟鞋 | 亚洲欧美在线免费观看| 亚洲国产精品福利| 久久久久在线| 国内自拍一区| 久久久久久久久综合| 欧美在线观看日本一区| 亚洲国产视频一区| 久久综合给合久久狠狠色| 一区二区三区免费在线观看| 欧美性片在线观看| 午夜在线视频观看日韩17c| 亚洲专区欧美专区| 国产一区二区三区免费在线观看| 久久久久久久久岛国免费| 欧美精选午夜久久久乱码6080| 亚洲精品久久久久久久久久久久| 亚洲国产美国国产综合一区二区| 欧美日韩国产美女| 久久夜色精品一区| 欧美特黄一区| 玖玖玖免费嫩草在线影院一区| 玖玖视频精品| 亚洲一区二区四区| 久久久久国内| 香蕉久久a毛片| 国产亚洲精品激情久久| 亚洲三级电影全部在线观看高清| 国产精品免费观看在线| 亚洲欧美激情一区二区| 午夜伦欧美伦电影理论片| 亚洲国产日韩欧美| 久久久久久久久久久久久女国产乱| 亚洲大片精品永久免费| 亚洲精品免费看| 国产三区精品| 亚洲国产欧美久久| 国产精品素人视频| 欧美美女操人视频| 久久综合久久综合久久综合| 在线看片成人| 一区二区三区欧美日韩| 激情亚洲网站| 日韩一级免费观看| 激情小说另类小说亚洲欧美| 9人人澡人人爽人人精品| 永久91嫩草亚洲精品人人| 亚洲欧洲精品成人久久奇米网| 国产一区二区成人久久免费影院| 亚洲国产小视频在线观看| 国产偷久久久精品专区| 夜夜嗨av一区二区三区免费区| 好吊一区二区三区| 午夜影视日本亚洲欧洲精品| 一本大道久久a久久综合婷婷| 久久精品日产第一区二区| 国产精品每日更新在线播放网址| 亚洲欧美日韩一区在线观看| 亚洲女女女同性video| 久久一区二区三区超碰国产精品| 亚洲特级片在线| 欧美aⅴ99久久黑人专区| 久久精品国产亚洲一区二区三区| 欧美成人精品不卡视频在线观看 | 欧美xart系列高清| 国产精品日韩高清| 中文精品视频一区二区在线观看| 亚洲国产91色在线| 麻豆精品精品国产自在97香蕉| 久久av一区二区三区漫画| 亚洲午夜久久久久久久久电影网| 久久成人精品一区二区三区| 久久久久久久久综合| 欧美日韩亚洲不卡| 亚洲美女av黄| 欧美视频一区二区三区四区| 一本色道久久综合亚洲精品按摩| 欧美一级二区| 欧美在线1区| 久久国产精品99精品国产| 国产精品爱久久久久久久| 亚洲福利一区| 国产婷婷成人久久av免费高清| 亚洲欧洲日韩在线| 欧美一区二区成人6969| 国产精品高潮呻吟视频| 欧美一级黄色网| 免费观看日韩av| 国产酒店精品激情| 性欧美精品高清| 久久九九精品| 中文有码久久| 99热免费精品| 亚洲电影在线| 欧美午夜精彩| 免费在线看一区| 亚洲一区二区影院| 欧美/亚洲一区| 亚洲自拍偷拍网址| 黄色免费成人| 国产精品呻吟| 欧美精品91| 女人天堂亚洲aⅴ在线观看| 午夜精品亚洲| 在线一区二区日韩| 日韩一区二区高清| 亚洲欧洲视频| 欧美成人免费网站| 亚洲自拍都市欧美小说| 在线观看视频一区| 国产精品久久久久久久午夜片| 男人插女人欧美| 久久精品国产欧美激情| 欧美伊人久久久久久午夜久久久久| 国产精品每日更新| 欧美日韩精品在线观看| 欧美大片18| 巨乳诱惑日韩免费av| 午夜久久影院| 亚洲欧美韩国| 亚洲深夜福利视频| 亚洲美女少妇无套啪啪呻吟| 欧美激情第10页| 欧美高清不卡在线| 欧美黑人国产人伦爽爽爽| 欧美与欧洲交xxxx免费观看 | 亚洲在线免费视频| 中文在线资源观看视频网站免费不卡| 亚洲国产精彩中文乱码av在线播放| 国产精品专区第二| 国产精品亚洲视频| 国产精品免费一区豆花| 欧美日韩麻豆| 欧美色图首页| 国产乱码精品一区二区三| 国产日产欧产精品推荐色| 国产日韩亚洲欧美| 亚洲第一精品在线| 91久久久久|