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

The Fourth Dimension Space

枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯的一題)

Bloxorz I

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 2624 Accepted: 882

Description

Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which makes him excited. It's a game about rolling a box to a specific position on a special plane. Precisely, the plane, which is composed of several unit cells, is a rectangle shaped area. And the box, consisting of two perfectly aligned unit cube, may either lies down and occupies two neighbouring cells or stands up and occupies one single cell. One may move the box by picking one of the four edges of the box on the ground and rolling the box 90 degrees around that edge, which is counted as one move. There are three kinds of cells, rigid cells, easily broken cells and empty cells. A rigid cell can support full weight of the box, so it can be either one of the two cells that the box lies on or the cell that the box fully stands on. A easily broken cells can only support half the weight of the box, so it cannot be the only cell that the box stands on. An empty cell cannot support anything, so there cannot be any part of the box on that cell. The target of the game is to roll the box standing onto the only target cell on the plane with minimum moves.


The box stands on a single cell

 


The box lies on two neighbouring cells, horizontally

 


The box lies on two neighbouring cells, vertically

 

After Little Tom passes several stages of the game, he finds it much harder than he expected. So he turns to your help.

Input

Input contains multiple test cases. Each test case is one single stage of the game. It starts with two integers R and C(3 ≤ R, C ≤ 500) which stands for number of rows and columns of the plane. That follows the plane, which contains R lines and C characters for each line, with 'O' (Oh) for target cell, 'X' for initial position of the box, '.' for a rigid cell, '#' for a empty cell and 'E' for a easily broken cell. A test cases starts with two zeros ends the input.

It guarantees that

  • There's only one 'O' in a plane.
  • There's either one 'X' or neighbouring two 'X's in a plane.
  • The first(and last) row(and column) must be '#'(empty cell).
  • Cells covered by 'O' and 'X' are all rigid cells.

Output

For each test cases output one line with the minimum number of moves or "Impossible" (without quote) when there's no way to achieve the target cell.  

Sample Input

7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
0 0

Sample Output

10

Source




此題是標準的BFS,但是要注意優化,寫的不好代碼很容易超過5000B.
1.首先是狀態壓縮,積木可以立起來,也可以朝向上下左右躺下,其實向左躺和向右躺下實際上是同一種狀態,向上躺和向下躺亦然,所以本題可以壓縮成3個狀態,這里用1表示直立,2表示橫躺,3表示豎躺,可以節省大量空間花費;
2.用隊列進行廣搜的時候最好不要使用STL的queue容器,由于queue的初始值有限,搜索的時候需要大量移動內存中的數據,效率比較低,不妨手工直接模擬一個隊列。
3.在搜索的時候,由于狀態空間比較大,如果一一列出,代碼過于冗長,比較好的方法是用一個三維矩陣來存儲狀態之間的關系,這樣搜索的過程可以只用一個for循環來實現,代碼十分精簡。
4.最好進行初始化,讀入數據的時候將其轉化成整數,這樣操作起來比較方便。

下面是我的代碼:
//This is the sorce code for POJ 3322
//created by abilitytao
//Time:2009年8月16日22:33:08
//special thanks to Rainer
#include<iostream>
using namespace std;
#define MAX 502
#define LINEMAX 9000000

struct node
{
    
int x,y;
    
int step;
    
int state;//1代表直立,2代表水平放,3代表垂直放
}
;

bool visit[MAX][MAX][4];
int graph[MAX][MAX];//0->empty cell,1->weak cell,2->rigid cell
node l[LINEMAX];

int dir[3][4][3]={{{0,-1,2},{-2,0,1},{0,2,2},{1,0,1}},
                
{{0,-1,0},{-1,0,-1},{0,1,0},{2,0,-1}},
                
{{0,-2,-2},{-1,0,0},{0,1,-2},{1,0,0}}}
;




inline 
bool check(int x,int y,int state)
{
    
if(graph[x][y]==0return false;
    
if(state==1&&graph[x][y]==1return false;
    
else if(state==2&&graph[x+1][y]==0)    return false;
    
else if(state==3&&graph[x][y-1]==0)    return false;
    
return true;
}




inline node inputgraph(
int r,int c,int &endx,int &endy)
{

    
int i,j;
    
int len;
    
char temp[MAX];
    
int x1=0,y1=0;
    
int x2=0,y2=0;
    
int flag=0;
    node s;    
    memset(graph,
0,sizeof(graph));//Graph矩陣清0
    memset(visit,0,sizeof(visit));//visit矩陣清0
    for(i=1;i<=r;i++)
    
{

        scanf(
"%s",temp);
        len
=strlen(temp);
        
for(j=0;j<len;j++)
        
{
            
if(temp[j]=='#') graph[j+1][i]=0;
            
else if(temp[j]=='E') graph[j+1][i]=1;
            
else if(temp[j]=='.') graph[j+1][i]=2;
            
else if(temp[j]=='X'&&flag==0)
            
{
                graph[j
+1][i]=2;
                x1
=j+1;y1=i;
                flag
=1;
            }

            
else if(temp[j]=='X'&&flag==1)
            
{
                graph[j
+1][i]=2;
                x2
=j+1;y2=i;
            }

            
else if(temp[j]=='O')
            
{

                graph[j
+1][i]=2;
                endx
=j+1;
                endy
=i;
            }

        }

    }

    
if(x1!=0&&x2!=0&&y1!=0&&y2!=0)
    
{
        
if(y1<y2) {s.x=x1;s.y=y2;s.state=3;}
        
else if(x1<x2) {s.x=x1;s.y=y1;s.state=2;}
    }

    
else {s.x=x1;s.y=y1;s.state=1;}
    s.step
=0;
    
return s;
}



int main()
{
    
    
int r,c;
    
int i,j;
    
int endx,endy;
    
int newx,newy;
    
int newstate;
    
while(scanf("%d%d",&r,&c))
    
{
        
        
if(r==0&&c==0)
            
break;
        
int front=1;
        
int rear=1;
        l[front]
=inputgraph(r,c,endx,endy);
        visit[l[front].x][l[front].y][l[front].state]
=1;
        
while(front<=rear)
        
{
            
if(l[front].x==endx&&l[front].y==endy&&l[front].state==1)
            
{
                printf(
"%d\n",l[front].step);
                
break;
            }


            
for(j=0;j<4;j++)
            
{
                newx
=l[front].x+dir[l[front].state-1][j][0];
                newy
=l[front].y+dir[l[front].state-1][j][1];
                newstate
=l[front].state+dir[l[front].state-1][j][2];
                
if(!visit[newx][newy][newstate]&&check(newx,newy,newstate))
                
{
                    
                    rear
=rear++;
                    l[rear].x
=newx;
                    l[rear].y
=newy;
                    l[rear].state
=newstate;
                    visit[newx][newy][newstate]
=1;
                    l[rear].step
=l[front].step+1;
                }

            }

        
        front
++;
        }

        
if(front>rear)
            printf(
"Impossible\n");
    }

    
return 0;
}



posted on 2009-08-16 22:25 abilitytao 閱讀(1888) 評論(4)  編輯 收藏 引用

評論

# re: POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯的一題) 2009-08-16 23:30 expter

好多acmer。。。

LZ大幾啊。。。  回復  更多評論   

# re: POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯的一題) 2009-08-16 23:49 abilitytao

@expter
大二 學長多多指教啊  回復  更多評論   

# re: POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯的一題) 2009-08-19 14:40 個性藝術簽名

上島咖啡書店  回復  更多評論   

# re: POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯的一題) 2009-08-31 11:22 路過

呵呵 發現我是第1000個閱讀者呢 飄過哈 ~  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩国产区| 国产精品久久亚洲7777| 国产综合色精品一区二区三区| 亚洲午夜高清视频| 一本久久综合亚洲鲁鲁五月天| 欧美三级在线视频| 亚洲一区二区三区四区视频| 99精品欧美一区| 国产精品视频yy9299一区| 欧美在线1区| 久久精品一区二区三区中文字幕 | 亚洲精品久久久久久久久久久| 老司机67194精品线观看| 亚洲国产99精品国自产| 亚洲欧洲日本国产| 国产精品国内视频| 久久久国产成人精品| 久久日韩粉嫩一区二区三区| 亚洲精品久久久久久一区二区| 日韩视频精品在线观看| 国产欧美综合在线| 欧美激情视频免费观看| 欧美日韩国产精品成人| 久久精品视频播放| 欧美国产日韩一区二区| 午夜精品99久久免费| 久久久99国产精品免费| 亚洲精品欧美| 亚洲欧美日韩天堂一区二区| 1024成人网色www| 99国产精品久久久久老师| 国产一区二区av| 亚洲肉体裸体xxxx137| 国产女人18毛片水18精品| 欧美高清视频www夜色资源网| 欧美日韩一区二| 免费短视频成人日韩| 欧美日一区二区三区在线观看国产免| 久久九九免费视频| 欧美日韩一区在线播放| 欧美www视频| 国产精品毛片a∨一区二区三区|国| 男女激情视频一区| 国产九九视频一区二区三区| 欧美激情一区二区三区全黄 | 久久综合久久美利坚合众国| 亚洲午夜国产成人av电影男同| 久久久精品动漫| 久久国产99| 欧美性一区二区| 亚洲乱码精品一二三四区日韩在线| 激情婷婷欧美| 香蕉国产精品偷在线观看不卡| 亚洲网站视频福利| 欧美国产三区| 欧美激情一区二区三区不卡| 黄色成人在线观看| 欧美中文字幕第一页| 亚洲女同精品视频| 欧美色大人视频| 亚洲免费电影在线观看| 亚洲精品美女在线| 欧美成人精品1314www| 久久综合久久久久88| 国产亚洲精久久久久久| 午夜激情久久久| 久久精品一本久久99精品| 国产精品户外野外| 亚洲午夜精品| 欧美在线视频二区| 国产精品一区久久久| 亚洲一区在线观看视频| 亚洲欧美在线一区| 国产日韩视频一区二区三区| 亚洲欧美成人精品| 久久久一区二区| 亚洲第一精品在线| 免费观看久久久4p| 亚洲国产91色在线| 中文在线不卡| 欧美午夜精品久久久| 一区二区三区日韩| 久久精品官网| 在线成人中文字幕| 欧美福利小视频| 99国产精品| 久久精品男女| 在线看国产一区| 欧美激情精品久久久久久黑人| 最新高清无码专区| 亚洲欧美中文另类| 国产综合婷婷| 欧美黄污视频| 午夜天堂精品久久久久| 久久视频在线视频| 日韩亚洲不卡在线| 国产精品视频一二| 蜜臀av一级做a爰片久久| 亚洲人久久久| 久久久www成人免费毛片麻豆 | 欧美不卡福利| 亚洲一二三区精品| 欧美+日本+国产+在线a∨观看| 亚洲精品在线免费| 国产偷国产偷精品高清尤物| 久久亚洲视频| 亚洲在线成人精品| 亚洲国产精品99久久久久久久久| 亚洲一二三区精品| 狠久久av成人天堂| 欧美日韩一区二区视频在线观看| 欧美一区二区三区免费大片| 亚洲国产高清aⅴ视频| 欧美在线一二三四区| 99精品视频一区| 激情综合在线| 国产精品一区二区在线观看| 久久噜噜亚洲综合| 性欧美超级视频| 日韩亚洲在线观看| 欧美电影专区| 久久综合狠狠| 欧美在线观看视频一区二区三区| 亚洲作爱视频| 亚洲国产日韩欧美一区二区三区| 国产精品久久久久免费a∨| 麻豆亚洲精品| 久久一区欧美| 欧美在线观看日本一区| 亚洲一区二区三区四区视频 | 久久夜精品va视频免费观看| 中国女人久久久| 99在线精品免费视频九九视| 一区免费观看| 一区二区三区我不卡| 国产欧美日韩视频一区二区三区| 欧美日韩视频在线| 欧美日本中文字幕| 欧美成人精品一区二区三区| 久久嫩草精品久久久精品| 久久成人免费日本黄色| 欧美亚洲视频在线看网址| 亚洲一区区二区| 亚洲小说欧美另类社区| 一本久道久久久| 亚洲图片欧洲图片日韩av| 日韩午夜高潮| 一二三区精品| 亚洲小少妇裸体bbw| 一区二区冒白浆视频| 中国成人黄色视屏| 亚洲视频精品在线| 亚洲免费视频在线观看| 午夜精品www| 久久精品国产99精品国产亚洲性色| 欧美在线黄色| 久久婷婷国产综合精品青草| 久久综合给合| 欧美成人精品一区| 欧美午夜一区二区福利视频| 国产精品美女久久久久久久| 国产欧美精品久久| 伊伊综合在线| 亚洲精品久久嫩草网站秘色| 亚洲片国产一区一级在线观看| 亚洲日韩欧美视频一区| 一区二区三区成人精品| 香蕉乱码成人久久天堂爱免费| 久久久久国产精品午夜一区| 麻豆精品网站| 亚洲免费观看视频| 亚洲欧美日韩系列| 蜜臀av性久久久久蜜臀aⅴ| 欧美精品成人| 国产日韩欧美| 亚洲日本乱码在线观看| 一本色道久久99精品综合 | 午夜精品视频一区| 久久久久看片| 亚洲精品中文在线| 欧美一区日本一区韩国一区| 久久夜色精品国产| 国产精品高潮视频| 亚洲高清不卡在线| 亚洲欧美国产毛片在线| 久久在线免费观看视频| 亚洲精品午夜精品| 久久精品国产第一区二区三区最新章节 | 欧美激情亚洲视频| 亚洲午夜小视频| 蜜臀va亚洲va欧美va天堂| 欧美午夜精品久久久久久孕妇| 在线播放日韩专区| 亚洲自拍偷拍一区| 亚洲国产小视频| 久久精品亚洲乱码伦伦中文 | 欧美日韩综合在线免费观看| 国产专区综合网| 先锋资源久久| 99在线精品视频在线观看|