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

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| 亚洲国产精品一区二区www在线| 欧美大尺度在线观看| 欧美二区在线| 亚洲午夜高清视频| 性娇小13――14欧美| 在线看国产日韩| 最新成人av在线| 欧美三级视频在线播放| 香蕉视频成人在线观看| 欧美在线免费一级片| 亚洲国产精品成人va在线观看| 亚洲人成免费| 国产日产亚洲精品| 欧美国产一区在线| 国产精品高潮呻吟视频 | 老司机午夜精品视频在线观看| 亚洲第一在线视频| 99re亚洲国产精品| 国模精品一区二区三区| 最新国产成人av网站网址麻豆 | 欧美精品亚洲一区二区在线播放| 亚洲一区在线免费| 久久青草欧美一区二区三区| 亚洲午夜一区| 裸体丰满少妇做受久久99精品| 亚洲一区制服诱惑| 老司机午夜免费精品视频| 亚洲欧美成人精品| 毛片av中文字幕一区二区| 午夜精品久久久久久久白皮肤| 免费影视亚洲| 欧美综合国产精品久久丁香| 欧美激情黄色片| 嫩模写真一区二区三区三州| 国产精品成人一区二区网站软件| 免费观看欧美在线视频的网站| 国产精品高精视频免费| 欧美激情无毛| 在线播放国产一区中文字幕剧情欧美| 亚洲免费观看高清完整版在线观看| 国产亚洲精品久久久久动| 亚洲最新中文字幕| 亚洲精品在线三区| 麻豆久久久9性大片| 久久午夜影视| 国产日韩精品在线播放| 亚洲午夜免费福利视频| 日韩视频专区| 欧美国产一区二区| 欧美激情片在线观看| 伊人久久男人天堂| 久久久xxx| 男人的天堂亚洲| 禁断一区二区三区在线| 欧美一区亚洲二区| 欧美在线高清| 国产日韩欧美在线播放不卡| 亚洲视频免费在线| 亚洲欧美日韩国产精品| 欧美午夜不卡影院在线观看完整版免费 | 国产精品欧美激情| 夜夜嗨av一区二区三区四季av| 99ri日韩精品视频| 欧美日韩另类丝袜其他| 亚洲精品一区在线观看香蕉| 亚洲精选在线| 欧美日韩国产区| 中文网丁香综合网| 欧美一级在线亚洲天堂| 国产精品自在欧美一区| 亚洲欧美在线免费观看| 久久久久国产成人精品亚洲午夜| 国内精品久久久久久| 久久久久久久久综合| 欧美高潮视频| 一本色道久久综合亚洲精品小说| 欧美日韩久久久久久| 亚洲婷婷综合色高清在线| 久久成人免费| 亚洲国产成人91精品| 欧美日韩另类在线| 亚洲一区尤物| 狼人天天伊人久久| 99精品免费视频| 国产精品午夜在线观看| 久久久水蜜桃av免费网站| 91久久精品www人人做人人爽| 亚洲亚洲精品在线观看 | 国产一区二区观看| 欧美超级免费视 在线| 在线视频一区二区| 免费成人美女女| 亚洲视频一区二区| 韩国精品一区二区三区| 欧美精品在欧美一区二区少妇| 亚洲五月六月| 免费毛片一区二区三区久久久| 亚洲免费精彩视频| 国产视频在线观看一区| 欧美14一18处毛片| 亚洲欧美日韩精品综合在线观看| 欧美激情中文不卡| 性欧美大战久久久久久久免费观看 | 欧美成人免费大片| 亚洲欧美日韩成人| 亚洲国产第一| 久久精品一本久久99精品| 一本一道久久综合狠狠老精东影业| 国产日韩欧美一区二区三区四区| 欧美黑人在线播放| 久久久国产一区二区| 亚洲综合国产| 亚洲另类黄色| 亚洲高清精品中出| 久久久久国产免费免费| 亚洲一区欧美激情| 亚洲毛片视频| 亚洲国产视频一区二区| 黄色精品网站| 国产在线欧美| 国产精品一卡二卡| 欧美日韩ab| 欧美福利电影在线观看| 久久伊人免费视频| 欧美一区二区精品久久911| 在线亚洲+欧美+日本专区| 亚洲人成绝费网站色www| 欧美成人综合网站| 免费久久精品视频| 久久午夜精品一区二区| 久久精品视频在线观看| 久久riav二区三区| 久久成人精品电影| 久久精品99国产精品酒店日本| 午夜精品一区二区三区在线视 | 在线欧美电影| 在线观看欧美成人| 在线播放中文一区| 亚洲第一在线综合网站| 韩国av一区二区三区四区| 国内精品久久久久影院薰衣草| 国产一区二区三区四区老人| 国产欧美一区二区精品忘忧草| 国产精品丝袜白浆摸在线| 欧美午夜一区| 国产欧美日韩亚洲一区二区三区| 国产欧美一区二区三区久久| 国产亚洲欧美一区| 在线免费不卡视频| 亚洲欧洲一区二区三区久久| 亚洲精品婷婷| 亚洲小说欧美另类社区| 午夜亚洲影视| 麻豆精品传媒视频| 亚洲欧洲精品一区二区| 亚洲视频中文| 欧美影院成年免费版| 蜜桃av噜噜一区二区三区| 欧美激情一区二区| 国产精品美女久久久久久免费| 国产欧美日韩综合| 亚洲第一伊人| 亚洲午夜在线观看| 久久综合导航| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲美女性视频| 亚洲欧美国产77777| 久久久噜噜噜久久久| 欧美日韩精品免费观看视频| 国产精品免费在线| 精品成人久久| 亚洲视频1区| 久久综合狠狠| 9l国产精品久久久久麻豆| 欧美中文字幕不卡| 欧美久久久久中文字幕| 国产日产欧美精品| 亚洲老板91色精品久久| 欧美中文日韩| 亚洲激情网站| 久久国产欧美日韩精品| 欧美午夜片欧美片在线观看| 好看的日韩视频| 亚洲欧美国产视频| 欧美激情国产精品| 欧美亚洲日本国产| 欧美日韩性生活视频| 亚洲国产精品精华液2区45| 亚洲欧美激情一区| 亚洲欧洲综合| 玖玖精品视频| 精品999成人| 久久精品久久综合|