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

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

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

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

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

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

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

            我的思路是廣搜出月如所在的點可以到達的其他點需要多少時間可以到達,然后把女飛飛所在的點向八個方向擴展,ans=maxint,ans=min(ans,s[i][j])。m*n<=20000,二維數(shù)組[20000][20000]肯定會爆,應該用一維數(shù)組表示,但是數(shù)據(jù)很弱,用[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 閱讀(1099) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            亚洲国产精品无码久久九九| 久久成人国产精品免费软件| 久久人人爽人人爽人人AV| 久久天天躁夜夜躁狠狠躁2022| 国内精品人妻无码久久久影院导航| 欧美日韩精品久久免费| 无码人妻少妇久久中文字幕蜜桃| 久久久久高潮毛片免费全部播放 | 精品久久综合1区2区3区激情| 久久99亚洲综合精品首页| 亚洲色欲久久久综合网东京热| 2022年国产精品久久久久| 无码任你躁久久久久久久| 精品无码久久久久国产| 色婷婷综合久久久久中文字幕 | 色综合久久综合网观看| 少妇久久久久久被弄到高潮| 久久ZYZ资源站无码中文动漫| 久久久久亚洲AV无码专区网站| 蜜臀久久99精品久久久久久小说| 久久久久久久综合日本| 国产精品一久久香蕉产线看| 国产精品99久久久久久宅男小说| 青青草原1769久久免费播放| 伊人色综合久久天天人手人婷| 久久综合亚洲色HEZYO国产| 久久精品国产精品青草| 人妻精品久久无码区| 99久久香蕉国产线看观香| 久久综合九色综合欧美就去吻| 色综合久久天天综合| 久久亚洲国产精品一区二区| 久久久精品国产sm调教网站| 久久久久亚洲精品日久生情 | 狠狠久久亚洲欧美专区| 久久久国产精华液| 久久久久亚洲AV成人网人人网站| 久久性精品| 精品久久久久久久久免费影院| 久久久精品久久久久久| 欧美性猛交xxxx免费看久久久|