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

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>
            久久www成人_看片免费不卡| 在线观看视频一区| 国产精品日韩欧美一区二区| 国产欧美午夜| 99精品欧美| 巨胸喷奶水www久久久免费动漫| 亚洲电影免费观看高清完整版在线 | 亚洲国产婷婷香蕉久久久久久99 | 欧美一区二区三区在线播放| 欧美精品二区| 一区精品在线| 久久国产精品电影| 久久成人久久爱| 国产欧美一区二区视频| 久久久精彩视频| 亚洲欧美激情视频| 欧美午夜精品一区二区三区| 亚洲精品美女在线观看| 美女999久久久精品视频| 欧美亚洲一区二区在线| 亚洲国产精品第一区二区| 久久精品男女| 午夜精品久久久久久久久久久久久| 欧美另类一区二区三区| 99在线|亚洲一区二区| 亚洲免费观看高清在线观看| 欧美自拍偷拍午夜视频| 欧美视频二区| 亚洲精品久久久久久久久久久久| 亚洲精品影视| 欧美精品免费视频| 久久久不卡网国产精品一区| 久久一区二区三区四区五区| 精品动漫3d一区二区三区| 亚洲欧洲精品一区二区三区不卡| 久久精品91| 亚洲一区二区三区在线| 亚洲视频免费观看| 国产精品美女久久久久aⅴ国产馆| 99精品欧美一区| 欧美在线视频观看| 亚洲一区二区少妇| 久久在线播放| 亚洲人成欧美中文字幕| 91久久黄色| 影音欧美亚洲| 欧美一区二视频| 亚洲一区成人| 欧美日韩不卡合集视频| 午夜精品在线观看| 欧美中文字幕久久| 亚洲欧美自拍偷拍| 欧美日韩久久精品| 在线亚洲一区二区| 午夜精品久久久99热福利| a91a精品视频在线观看| 美女精品在线| 亚洲一区亚洲二区| 久久av红桃一区二区小说| 亚洲欧美日韩精品久久| 久久国产福利国产秒拍| 午夜影院日韩| 久久躁狠狠躁夜夜爽| 久久久久久久久久码影片| 国产精品午夜视频| 亚洲在线成人精品| 亚洲高清免费| 久热精品在线视频| 免费亚洲电影| 亚洲日本视频| 欧美精品二区| 亚洲另类在线一区| 亚洲性线免费观看视频成熟| 欧美日本精品| 一区二区av在线| 精品电影在线观看| 久久艳片www.17c.com| 久久中文字幕一区二区三区| 欧美日韩精品免费观看视频完整| 亚洲福利在线看| 亚洲国产精品久久久久秋霞蜜臀 | 欧美一级欧美一级在线播放| 欧美一区二区在线播放| 蜜臀久久99精品久久久画质超高清| 久久久亚洲午夜电影| 欧美体内谢she精2性欧美| 亚洲激情视频网| 这里只有视频精品| 国产精品一区二区男女羞羞无遮挡| 免费不卡在线观看av| 亚洲福利免费| 欧美国产一区二区在线观看| 久热爱精品视频线路一| 在线观看一区二区精品视频| 亚洲欧美日韩国产精品| 久久一二三四| 亚洲免费成人av| 久久亚洲综合色| 日韩午夜激情电影| 亚洲欧美国产高清| 国模吧视频一区| 亚洲欧美美女| 久久综合久久综合久久综合| 91久久在线观看| 国产精品高潮呻吟久久av无限| 欧美二区在线播放| 韩日视频一区| 久久九九久精品国产免费直播| 午夜精品一区二区三区在线视| 国模吧视频一区| 欧美三级电影一区| 麻豆freexxxx性91精品| 亚洲一区二区三区涩| 欧美成人精品福利| 国产色产综合色产在线视频| 欧美www在线| 欧美一区影院| 亚洲色图制服丝袜| 国产精品色婷婷| 欧美精品乱码久久久久久按摩| 欧美综合77777色婷婷| 一区二区三区国产| 亚洲激情一区| 欧美ab在线视频| 久久露脸国产精品| 欧美一区二区三区四区在线观看地址 | 久久免费一区| 亚洲欧美另类久久久精品2019| 日韩午夜中文字幕| 亚洲二区视频| 欧美jizz19性欧美| 久久天天躁夜夜躁狠狠躁2022| 性色av一区二区三区红粉影视| 中日韩美女免费视频网站在线观看| 亚洲黄色小视频| 欧美午夜精品久久久| 欧美xx视频| 午夜精品免费| 欧美高清日韩| 欧美不卡福利| 免费在线欧美视频| 欧美成人精品h版在线观看| 久久天堂精品| 蜜臀99久久精品久久久久久软件| 久久精品视频在线观看| 久久精品国产v日韩v亚洲| 久久av免费一区| 久久福利精品| 麻豆精品视频在线观看| 奶水喷射视频一区| 欧美国产一区二区| 欧美专区在线观看一区| 性18欧美另类| 久久精品国产免费| 久久综合狠狠| 亚洲国产精品成人精品| 亚洲国产美女| 一本色道**综合亚洲精品蜜桃冫 | 亚洲综合不卡| 欧美在线|欧美| 快射av在线播放一区| 欧美成人国产一区二区| 欧美日韩久久| 国产亚洲第一区| 欧美精品在线观看| 欧美视频在线观看 亚洲欧| 国产精品久久久一区麻豆最新章节 | 亚洲激精日韩激精欧美精品| 亚洲精品视频免费在线观看| 一区二区不卡在线视频 午夜欧美不卡'| 中文欧美字幕免费| 久久av老司机精品网站导航| 可以免费看不卡的av网站| 欧美区在线播放| 国产精品永久免费在线| 伊人久久综合| 亚洲午夜久久久久久久久电影院| 欧美亚洲一区| 欧美国产精品人人做人人爱| 一本不卡影院| 99精品视频免费观看视频| 亚洲午夜精品| 亚洲欧美精品一区| 久久伊人亚洲| 欧美香蕉视频| 亚洲激情成人网| 久久av一区| 亚洲卡通欧美制服中文| 欧美有码在线观看视频| 欧美日韩国产在线播放网站| 国产午夜精品久久久| 9l视频自拍蝌蚪9l视频成人| 久久久999精品免费| 亚洲美女av在线播放| 久久精品亚洲一区二区| 国产精品免费看久久久香蕉| 亚洲精品久久久久久一区二区| 久久国产精品久久国产精品| 9色porny自拍视频一区二区| 噜噜噜噜噜久久久久久91|