• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0

            在一個夜黑風高,伸手不見五指的深夜,睡夢中的林月如突然聽到房外一陣躁動。她出去一看,發現一個女飛賊搶了一個古董商的包袱。
            "站住!"
            "那你為什么不來追我?"
            "因為程序設計,在李大哥來之前,我不能追你。"
            "那李逍遙為什么不來呢?"
            "大概程序出bug了吧"
            ………………………………………………
            終于,在等了一個又一個時辰后,林月如終于忍不住了,開始向女飛賊發起進攻。
            "喂!你為什么可以動???"
            "這大概也是一個bug吧!"
            "不公平啊!"
            "廢話少說。"

            已知林月如和女飛賊站在一個矩陣中,矩陣中有某些障礙物不可穿越。月如使出的銅錢鏢可攻擊8個方向,但不可穿越障礙物(可視為不能穿墻的重狙)。每個單位時間,月如可向上下左右4個方向移動一格,攻擊不浪費時間。當然,月如想盡快結束這場無聊的戰斗,所以她想在最短的時間內消滅女飛賊。

            第一行為2個數N,M表示矩陣的規模(N為高,M為寬)。
            接下來是N*M的矩陣,O表示空地,X表示障礙物。
            下面是若干行數據,每行為一對數據,分別是女飛賊的位置和林月如的位置,顯然她們都不可能在障礙物上。

            每一組數據輸出一行,僅一個整數,表示能消滅掉女飛賊的最短時間。
            顯然若能直接打到女飛賊,則時間為0。
            若無法消滅,則輸出"Impossible!"。(不含引號)

            對于30%的數據,有N*M<=100
            對于50%的數據,有N*M<=400
            對于100%的數據,有N*M<=20000
            對于100%的數據,測試數據組數不超過20組

            本來可以一次AC的題目,一些比較具有相似性的句子在復制的時候忘了修改了,把'+'寫成了'-',第一次提交只得了30分,百思不得其解……

            我的思路是廣搜出月如所在的點可以到達的其他點需要多少時間可以到達,然后把女飛飛所在的點向八個方向擴展,ans=maxint,ans=min(ans,s[i][j])。m*n<=20000,二維數組[20000][20000]肯定會爆,應該用一維數組表示,但是數據很弱,用[200][200]可以AC。

            以下是我的代碼:

            #include<stdio.h>
            #define min(a,b) (a<b?a:b)
            #define maxint 200000000
            /*
            0 可到達的點 
            -1 障礙物 
            maxint 不可到達的點 
            */

            struct queue
            {
                
            long xi[20001],yi[20001],front,rear,count;
            }
            q;
            int empty()
            {
                
            return (q.count==0);
            }

            void clear()
            {
                q.front
            =0;
                q.rear
            =-1;
                q.count
            =0;
            }

            void put(long x,long y)
            {
                q.count
            ++;
                q.rear
            ++;
                q.xi[q.rear]
            =x;
                q.yi[q.rear]
            =y;
            }

            void get(long *x,long *y)
            {
                q.count
            --;
                
            *x=q.xi[q.front];
                
            *y=q.yi[q.front];
                q.front
            ++;
            }

            int main()
            {
                
            char tmp,ch,map[201][201];
                
            long m,n,x1,y1,x2,y2,i,j,xx,yy,s[201][201]={0};
                
            long xd[]={0/**/,-1,-1,0,1,1,1,0,-1};
                
            long yd[]={0/**/,0,1,1,1,0,-1,-1,-1};

                scanf(
            "%ld%ld\n",&m,&n);
                
            for(i=1;i<=m;i++)
                
            {
                  
            for(j=1;j<=n;j++)
                     scanf(
            "%c",&map[i][j]);
                  scanf(
            "%c",&tmp);
                }

                scanf(
            "%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
                
            //------Read In
                while(x1!=0||x2!=0||y1!=0||y2!=0)
                
            {
                   
            //------BFS
                   long ans=maxint;
                   clear();
                   
            for(i=1;i<=m;i++)
                     
            for(j=1;j<=n;j++)
                     
            {
                        
            if(map[i][j]=='O')
                          s[i][j]
            =maxint;
                        
            else if(map[i][j]=='X')
                          s[i][j]
            =-1;
                     }

                   s[x2][y2]
            =0;
                   put(x2,y2);
                   
            while(!empty())
                   
            {
                      
            get(&xx,&yy);
                      
            if(xx>=2&&s[xx-1][yy]!=-1&&s[xx-1][yy]==maxint&&(xx-1!=x2||yy!=y2))
                      
            {
                         put(xx
            -1,yy);
                         s[xx
            -1][yy]=s[xx][yy]+1;
                      }

                      
            if(xx+1<=m&&s[xx+1][yy]!=-1&&s[xx+1][yy]==maxint&&(xx+1!=x2||yy!=y2))
                      
            {
                         put(xx
            +1,yy);
                         s[xx
            +1][yy]=s[xx][yy]+1;
                      }

                      
            if(yy>=2&&s[xx][yy-1]!=-1&&s[xx][yy-1]==maxint&&(xx!=x2||yy-1!=y2))
                      
            {
                         put(xx,yy
            -1);
                         s[xx][yy
            -1]=s[xx][yy]+1;
                      }

                      
            if(yy+1<=n&&s[xx][yy+1]!=-1&&s[xx][yy+1]==maxint&&(xx!=x2||yy+1!=y2))
                      
            {
                         put(xx,yy
            +1);
                         s[xx][yy
            +1]=s[xx][yy]+1;
                      }

                   }

                   
            for(i=1;i<=8;i++)
                   
            {
                      xx
            =x1+xd[i];
                      yy
            =y1+yd[i];
                      
            while( s[xx][yy]!=-1 && xx>=1 && xx<=&& yy>=1 && yy<=n )
                      
            {
                         ans
            =min(ans,s[xx][yy]);
                         xx
            +=xd[i];
                         yy
            +=yd[i];
                      }

                   }

                   
            if(ans!=maxint)
                      printf(
            "%ld\n",ans);
                   
            else
                      printf(
            "Impossible!\n");
                   scanf(
            "%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
                }

            return 0;
            }

            posted on 2010-01-06 18:36 lee1r 閱讀(1110) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            伊人热热久久原色播放www| 欧洲精品久久久av无码电影| 亚洲精品无码久久久| 精品无码久久久久久久久久| 久久精品www| 精品伊人久久大线蕉色首页| 一本色道久久99一综合| 品成人欧美大片久久国产欧美...| 99久久精品免费观看国产| 性做久久久久久久久浪潮| 久久精品中文闷骚内射| 久久人妻少妇嫩草AV无码蜜桃| 中文字幕无码久久人妻| 国产精品热久久无码av| www.久久99| 亚洲午夜精品久久久久久浪潮| 国产精品久久久久影院嫩草| 久久综合视频网站| 国产精品成人久久久久三级午夜电影 | 久久91亚洲人成电影网站| 亚洲午夜无码久久久久小说| 国产产无码乱码精品久久鸭 | 91精品国产综合久久精品| 久久亚洲精品成人无码网站| 亚洲AV无码久久| 久久婷婷五月综合色奶水99啪 | 亚洲国产精品久久久久婷婷软件| 久久久久亚洲av成人网人人软件| 亚洲Av无码国产情品久久| 伊人久久国产免费观看视频 | 久久久久久国产精品免费无码| 亚洲国产二区三区久久| 四虎影视久久久免费观看| 国内精品久久国产| 青青热久久综合网伊人| 综合久久一区二区三区 | 新狼窝色AV性久久久久久| 男女久久久国产一区二区三区| 中文字幕成人精品久久不卡| 国产女人aaa级久久久级| 久久人爽人人爽人人片AV|