• <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>

            A Za, A Za, Fighting...

            堅信:勤能補拙

            PKU 1324 Holedox Moving

            問題:
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1324

            參考:
            http://hi.baidu.com/aekdycoin/blog/item/08774afbd1a29316a8d31111.html
            http://clover520.blogbus.com/logs/38001465.html

            思路:
            用BFS求最短路徑肯定是沒有問題的,關鍵是狀態如何表示
            參考別人的思路,原來蛇身只需要通過上、下、左、右四個方向表示即可(兩bits或4進制),這樣可以很大程度上減少空間,而且判重也就不再是個問題,只需要用三維數組表示即可
            不過我自己寫出來的代碼卻總是MLE,悲劇...(無奈,貼了別人代碼過的,無恥啊)

            代碼:
             1 #include<stdio.h>
             2 #include<stdlib.h>
             3 #include<string.h>
             4 
             5 int kk[4][2]={1,0,0,1,0,-1,-1,0},N,M,L;
             6 struct point{
             7     char x,y;
             8     int dis,body;
             9 };
            10 int bfs();
            11 int main(){
            12     int Cas=0;
            13     while(scanf("%d%d%d",&N,&M,&L)==3){
            14         if(N==0&&M==0&&L==0)break;
            15         printf("Case %d: %d\n",++Cas,bfs());
            16     }
            17     return 0;
            18 }
            19 char viss[20][20][1<<14];
            20 int vis(struct point* t){
            21     int ans=0,i=0;
            22     if(viss[t->x][t->y][t->body])return 1;
            23     viss[t->x][t->y][t->body]=1;
            24     return 0;
            25 }
            26 char map[20][20],mapt[20][20];
            27 char valid(int x,int y){
            28     if(x<0||x>=N||y<0||y>=M||mapt[x][y])return 0;
            29     return 1;
            30 }
            31 struct point Q[20*20*(1<<14)];
            32 int head,tail;
            33 int bfs(){
            34     int x,y,lx,ly,i,k,nx,ny;
            35     struct point t,now;
            36     memset(viss,0,sizeof(viss));
            37     scanf("%d%d",&lx,&ly);
            38     t.x=lx-1;t.y=ly-1;t.dis=0;t.body=0;
            39     for(i=1;i<L;++i){
            40         scanf("%d%d",&x,&y);
            41         for(k=0;k<4;++k)if(lx+kk[k][0]==x&&ly+kk[k][1]==y)break;
            42         t.body|=k<<((i-1)<<1);
            43         lx=x;ly=y;
            44     }
            45     memset(map,0,sizeof(map));
            46     scanf("%d",&k);
            47     for(i=0;i<k;++i){
            48         scanf("%d%d",&x,&y);
            49         map[x-1][y-1]=1;
            50     }
            51     head=tail=0;
            52     Q[tail++]=t;
            53     vis(&t);
            54     while(head!=tail){
            55         now=Q[head++];
            56         if(now.x==0&&now.y==0)return now.dis;
            57         
            58         memcpy(mapt,map,sizeof(map));
            59         mapt[x=now.x][y=now.y]=1;
            60         int s=now.body;
            61         for(i=1;i<L;++i,s>>=2){
            62             k=s&3;
            63             mapt[x=x+kk[k][0]][y=y+kk[k][1]]=1;
            64         }
            65         
            66         for(k=0;k<4;++k){
            67             if(!valid(nx=now.x+kk[k][0],ny=now.y+kk[k][1]))continue;
            68             t.x=nx,t.y=ny;
            69             t.body=((now.body<<2)|(3-k))&((1<<((L-1)<<1))-1);
            70             t.dis=now.dis+1;
            71             if(!vis(&t)){
            72                 Q[tail++]=t;
            73             }
            74         }
            75     }
            76     return -1;
            77 }

            posted on 2010-09-03 10:05 simplyzhao 閱讀(337) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導航

            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品国产VA久久久久久久冰| 久久中文字幕一区二区| 亚洲精品久久久www| 97久久国产综合精品女不卡| 久久99精品久久久久久久不卡| 久久国产精品-久久精品| 国内精品久久久久久久亚洲| 综合久久国产九一剧情麻豆| 91精品国产高清91久久久久久| 天天影视色香欲综合久久| 97久久精品国产精品青草| 国产精品一区二区久久精品涩爱 | 国产午夜精品理论片久久| 亚洲性久久久影院| 久久久久久狠狠丁香| 九九精品久久久久久噜噜| 国产福利电影一区二区三区久久久久成人精品综合 | 丁香五月综合久久激情| 中文字幕日本人妻久久久免费| 久久精品综合一区二区三区| 久久人人爽人人爽人人AV东京热| 久久精品免费网站网| 国产精品99久久久久久人| 久久亚洲AV成人无码| 久久久久99精品成人片| segui久久国产精品| 青青青国产精品国产精品久久久久| 久久天天躁狠狠躁夜夜2020一| 久久香蕉一级毛片| 日本一区精品久久久久影院| 久久人人爽人人爽人人片AV不| 亚洲va久久久噜噜噜久久天堂| 欧美日韩中文字幕久久久不卡| 国产精品青草久久久久福利99 | 久久精品一区二区| 久久久精品人妻一区二区三区四 | 好久久免费视频高清| 久久精品亚洲一区二区三区浴池 | 狠狠色综合久久久久尤物| 国产成人无码精品久久久久免费| 久久九九全国免费|