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

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 閱讀(1867) 評論(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個閱讀者呢 飄過哈 ~  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品乱码久久久久久| 欧美一区二区啪啪| 久久久激情视频| 久久国产视频网站| 在线不卡中文字幕播放| 欧美国产免费| 欧美日韩黄色大片| 亚洲免费在线观看| 久久福利视频导航| 亚洲精品社区| 亚洲午夜精品17c| 国产一区二区三区免费不卡 | 亚洲欧美国产高清va在线播| 亚洲男人第一网站| 影音先锋亚洲精品| 亚洲人成网站色ww在线| 国产精品久久久久久av福利软件| 亚洲免费在线观看视频| 久久看片网站| 亚洲天堂av在线免费| 欧美一区在线看| 亚洲精品美女免费| 在线成人h网| 欧美激情一区二区三区蜜桃视频| 在线综合+亚洲+欧美中文字幕| 一本一本大道香蕉久在线精品| 国产精品一区一区| 欧美激情bt| 国产精品一级久久久| 亚洲国产91| 国产亚洲精品7777| 99re6这里只有精品| 国产一区二区三区直播精品电影| 亚洲第一级黄色片| 韩国福利一区| 亚洲视频1区| 亚洲精品一二三| 午夜精品久久久久影视| 99视频精品全部免费在线| 久久超碰97人人做人人爱| 亚洲天堂av在线免费观看| 久久综合久久综合这里只有精品| 亚洲欧美中文另类| 欧美精品色综合| 免费不卡欧美自拍视频| 国产欧美日韩视频在线观看 | 亚洲大胆人体在线| 午夜精品成人在线视频| 在线综合欧美| 欧美精品在线看| 欧美波霸影院| 黑丝一区二区| 欧美在线短视频| 亚洲欧美一区二区在线观看| 欧美久久在线| 亚洲第一福利在线观看| 亚洲国产成人不卡| 久久久久久久一区二区| 久久噜噜噜精品国产亚洲综合 | 欧美激情中文字幕一区二区| 欧美成年人网站| 亚洲国产成人av在线| 久久久综合精品| 欧美不卡福利| 亚洲欧洲日本专区| 免费观看一区| 亚洲人精品午夜在线观看| 日韩视频专区| 欧美日韩综合网| 国产精品99久久久久久久vr | 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 久久夜色精品国产亚洲aⅴ| 国产精品视频yy9099| 亚洲永久免费| 欧美伊人久久| 一色屋精品亚洲香蕉网站| 久久蜜桃av一区精品变态类天堂| 麻豆freexxxx性91精品| 亚洲精品乱码久久久久久日本蜜臀 | 欧美大片免费观看在线观看网站推荐| 六月丁香综合| 亚洲精品国产品国语在线app| 久热精品视频在线观看| 亚洲国产成人精品女人久久久| 亚洲肉体裸体xxxx137| 欧美精品系列| 亚洲香蕉伊综合在人在线视看| 久久久精品五月天| 亚洲国产你懂的| 国产精品sss| 欧美亚洲自偷自偷| 亚洲国产欧美一区二区三区同亚洲| 日韩一区二区精品葵司在线| 国产精品美女黄网| 久久国产精品99国产精| 亚洲国产成人精品久久| 亚洲免费一级电影| 伊甸园精品99久久久久久| 欧美日韩成人一区二区| 香蕉视频成人在线观看| 亚洲韩国日本中文字幕| 久久99在线观看| 亚洲精品韩国| 国产三区精品| 欧美激情第一页xxx| 午夜伦理片一区| 亚洲国产导航| 久久久亚洲人| 亚洲午夜久久久久久久久电影网| 国产情人节一区| 欧美日韩国产a| 久久久久久一区二区| 中国女人久久久| 亚洲国产99| 六十路精品视频| 久久精品国内一区二区三区| 一区二区三区视频在线播放| 亚洲高清二区| 国内精品福利| 国产日韩欧美在线播放不卡| 欧美精品成人在线| 美女精品自拍一二三四| 午夜电影亚洲| 亚洲视频二区| 亚洲乱亚洲高清| 亚洲国产高清在线| 欧美大胆成人| 免费成人小视频| 久久久国产午夜精品| 欧美一区二区三区久久精品 | 国产精品久久久久一区| 欧美精品在线免费观看| 久热精品视频在线观看一区| 欧美一级片一区| 亚洲一区二区三区午夜| 日韩一级黄色大片| 91久久精品网| 亚洲精品免费看| 亚洲国产影院| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美高清一区| 欧美电影电视剧在线观看| 免费日韩av片| 欧美激情1区2区3区| 欧美激情亚洲国产| 欧美成人精品在线播放| 欧美不卡在线视频| 欧美成人免费va影院高清| 欧美激情91| 亚洲精品国产精品国产自| 亚洲另类在线一区| 亚洲午夜久久久久久久久电影院| 艳妇臀荡乳欲伦亚洲一区| 在线视频一区观看| 亚洲精品视频啊美女在线直播| 欧美激情aⅴ一区二区三区| 欧美成人自拍| 欧美另类综合| 国产精品久久久久久久电影| 国产欧美日韩不卡免费| 国产亚洲激情在线| 亚洲国产一区二区精品专区| 亚洲人成人99网站| 亚洲伊人网站| 久久久国产午夜精品| 欧美丰满少妇xxxbbb| 亚洲免费福利视频| 亚洲欧美www| 看欧美日韩国产| 欧美裸体一区二区三区| 国产美女精品视频免费观看| 1204国产成人精品视频| 99视频一区二区| 欧美中文字幕第一页| 美国成人直播| 亚洲理伦电影| 午夜一区二区三视频在线观看| 久久躁狠狠躁夜夜爽| 欧美日韩亚洲国产精品| 韩国女主播一区| 在线视频中文亚洲| 久久久九九九九| 亚洲日本久久| 久久国产精品黑丝| 欧美揉bbbbb揉bbbbb| 黄色在线成人| 亚洲欧美激情诱惑| 亚洲第一中文字幕| 性做久久久久久免费观看欧美| 欧美二区在线播放| 国产亚洲福利一区| 亚洲一区二区网站| 欧美高清视频一区| 欧美一区二区三区久久精品| 欧美日韩国产欧| 亚洲高清激情| 久久亚洲私人国产精品va媚药| 91久久精品国产91久久| 久久精品一本| 国产日韩精品一区二区浪潮av|