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

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

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

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

            每一組數(shù)據(jù)輸出一行,僅一個(gè)整數(shù),表示能消滅掉女飛賊的最短時(shí)間。
            顯然若能直接打到女飛賊,則時(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的題目,一些比較具有相似性的句子在復(fù)制的時(shí)候忘了修改了,把'+'寫成了'-',第一次提交只得了30分,百思不得其解……

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

            以下是我的代碼:

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

            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 閱讀(1083) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            国产精品99久久久久久猫咪| 人妻久久久一区二区三区| 久久av免费天堂小草播放| 国产成人久久久精品二区三区| 国产香蕉97碰碰久久人人| 久久精品免费大片国产大片| 亚洲精品综合久久| 久久久久亚洲av无码专区| 国产精品青草久久久久婷婷| 久久国产成人精品国产成人亚洲| 伊人久久五月天| 精品久久久久中文字幕日本| 国产69精品久久久久99尤物| 久久亚洲国产精品成人AV秋霞| 久久久久久无码Av成人影院| 久久亚洲高清综合| 久久精品亚洲中文字幕无码麻豆| 国产精品成人精品久久久| A级毛片无码久久精品免费| 国产精品久久成人影院| 香蕉99久久国产综合精品宅男自| 久久精品国产亚洲AV大全| 欧美日韩精品久久久免费观看| 久久亚洲精品无码AV红樱桃| 久久久精品无码专区不卡| 无码人妻少妇久久中文字幕蜜桃| 国产亚洲美女精品久久久| 天堂久久天堂AV色综合| 久久综合色之久久综合| 97久久超碰成人精品网站| 久久精品免费全国观看国产| 欧美亚洲另类久久综合| 久久人妻少妇嫩草AV蜜桃| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产∨亚洲V天堂无码久久久| 色天使久久综合网天天| 99久久国产亚洲高清观看2024 | 日韩乱码人妻无码中文字幕久久| 国产综合精品久久亚洲| 久久午夜羞羞影院免费观看| 久久中文字幕人妻熟av女|