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

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>
            久久九九热免费视频| 亚洲中无吗在线| 麻豆av福利av久久av| 久久精品国产久精国产思思| 国产一区二区主播在线| 久久久夜夜夜| 蜜桃av一区二区| 99国产精品私拍| 亚洲图片欧美一区| 国产视频一区二区三区在线观看| 老司机精品视频一区二区三区| 久久影院午夜片一区| 亚洲另类一区二区| 在线亚洲成人| 黄色成人av网| 亚洲全部视频| 国产伦一区二区三区色一情| 嫩草国产精品入口| 欧美乱大交xxxxx| 亚洲一区二区三区免费视频| 欧美一区二区高清在线观看| 亚洲日本免费| 亚洲欧美日韩在线综合| 亚洲国产欧美另类丝袜| 亚洲精品1区2区| 亚洲日本aⅴ片在线观看香蕉| 欧美系列一区| 久久久夜精品| 欧美日韩高清在线一区| 久久精品卡一| 欧美人交a欧美精品| 久久九九国产精品| 欧美日产一区二区三区在线观看| 久久精品盗摄| 欧美日韩一区二区精品| 久久精品中文字幕免费mv| 欧美成va人片在线观看| 欧美一区二区女人| 欧美日本亚洲| 欧美成人综合| 国产亚洲欧美另类一区二区三区| 亚洲美女在线视频| 在线观看欧美成人| 午夜视频久久久| 亚洲最新色图| 欧美成人69av| 欧美va天堂va视频va在线| 国产精品久久午夜夜伦鲁鲁| 亚洲激情欧美激情| 黄网动漫久久久| 欧美一级理论性理论a| 99re8这里有精品热视频免费| 久久久久高清| 久久久久综合一区二区三区| 国产精品久久久免费| 亚洲精品久久久久久一区二区| 在线观看91久久久久久| 香港久久久电影| 欧美一区激情视频在线观看| 欧美视频第二页| 日韩视频免费大全中文字幕| 亚洲精品影院| 欧美激情视频免费观看| 亚洲国产欧美日韩精品| 91久久精品国产91久久| 女女同性精品视频| 亚洲国产高清在线| 亚洲精品一区在线观看香蕉| 欧美成年人视频| 亚洲激情偷拍| 亚洲小说欧美另类社区| 欧美日韩亚洲国产精品| 一区二区三区免费观看| 亚洲伊人久久综合| 国产精品女人久久久久久| 亚洲尤物在线视频观看| 久久国产一区二区三区| 国产一区二区三区视频在线观看 | 久久综合伊人77777蜜臀| 国产区在线观看成人精品| 亚洲欧美视频在线| 久久久福利视频| 伊人久久大香线| 欧美国产日韩一区二区| 99精品免费视频| 香蕉成人啪国产精品视频综合网| 国产欧美一区二区三区国产幕精品 | 久久国产精品99国产| 国产视频一区在线观看一区免费| 久久精品av麻豆的观看方式| 欧美成人精品高清在线播放| 亚洲久久在线| 国产精品狠色婷| 欧美在线视频a| 亚洲高清网站| 亚洲欧美在线x视频| 在线观看视频亚洲| 欧美久久影院| 欧美一区二区三区成人| 欧美福利影院| 午夜宅男久久久| 亚洲电影免费在线观看| 欧美精品久久99| 先锋影音国产一区| 亚洲精品乱码久久久久久日本蜜臀| 亚洲视频第一页| 亚洲高清视频在线| 国产精品久久二区| 欧美sm视频| 香蕉久久a毛片| 亚洲狠狠婷婷| 麻豆精品网站| 亚洲欧美视频| 99热在这里有精品免费| 国产曰批免费观看久久久| 欧美人与性动交cc0o| 欧美亚洲视频在线看网址| 亚洲精品一区二区三区四区高清| 久久青青草原一区二区| 亚洲欧美电影院| 99在线热播精品免费| 一区二区在线观看视频| 国产精品久久久一本精品| 看片网站欧美日韩| 久久精品首页| 香蕉久久国产| 午夜激情综合网| 亚洲与欧洲av电影| 亚洲婷婷在线| 在线视频日韩精品| 亚洲免费成人| 亚洲精品日日夜夜| 亚洲国产欧美在线人成| 老司机一区二区三区| 久久福利视频导航| 欧美一级夜夜爽| 欧美亚洲免费| 久久www免费人成看片高清| 亚洲专区在线视频| 亚洲综合国产激情另类一区| 在线一区二区三区四区| 亚洲老司机av| 亚洲视频精选在线| 在线视频日韩精品| 亚洲亚洲精品在线观看| 在线一区二区三区做爰视频网站| 日韩亚洲在线观看| 亚洲欧洲日韩综合二区| 最新中文字幕一区二区三区| 亚洲黄色成人网| 亚洲美女av黄| 亚洲天堂免费观看| 亚洲综合色激情五月| 亚洲欧洲av一区二区| 小处雏高清一区二区三区| 欧美专区亚洲专区| 久久久久久久国产| 欧美成人在线网站| 亚洲国产婷婷香蕉久久久久久| 亚洲激情一区| 在线一区二区三区四区| 亚洲一区二区三区精品在线| 亚洲欧美高清| 久久欧美中文字幕| 欧美精品一区二区三区蜜桃| 欧美日韩一区二区视频在线观看| 国产精品免费看| 影音欧美亚洲| 亚洲免费精品| 性做久久久久久久久| 麻豆91精品91久久久的内涵| 91久久精品久久国产性色也91| 亚洲毛片播放| 久久riav二区三区| 欧美二区视频| 国产精品一区在线观看你懂的| 国产综合久久久久影院| 亚洲美女视频网| 欧美一区二区三区视频在线观看| 久久精品免视看| 亚洲精品在线免费观看视频| 亚洲欧美精品在线观看| 欧美91视频| 国产日韩欧美a| 在线视频免费在线观看一区二区| 久久成人精品无人区| 亚洲激情网站| 久久久久久网| 国产精品久久国产精品99gif| 一区二区在线不卡| 亚洲欧美成人一区二区三区| 欧美成人免费网站| 亚洲在线日韩| 欧美精品一区二区精品网| 国产亚洲欧洲997久久综合| 夜夜爽av福利精品导航| 久久综合亚州| 亚洲综合国产激情另类一区| 欧美精品日韩三级| 亚洲成人在线视频播放|