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

            pku 3501 Escape from Enemy Territory 二分+BFS

            題意:
            網(wǎng)格圖上有N個敵人的據(jù)點(diǎn)。求從起點(diǎn)到終點(diǎn)路徑中到敵人據(jù)點(diǎn)Manhattan distance: dist((x1, y1), (x2, y2)) = |x2x1| + |y2y1|. 最長距離,如果有重復(fù),則使得路徑長度最短。
            解法:
            二分路徑中到敵人據(jù)點(diǎn)的最短距離,然后用BFS check
            注意在chk時可以開個bool數(shù)組來標(biāo)記,不用標(biāo)記到所有的不合法點(diǎn),只要標(biāo)記其輪廓就可以了,這樣可以降低復(fù)雜度的階
            代碼:
             1# include <cstdio>
             2# include <cstring>
             3using namespace std;
             4int n,w,h,sx,sy,ex,ey;
             5int p[10001][2];
             6int q[1000005][2];
             7int map[1001][1001];
             8# define abs(a) ((a)>0?(a):-(a))
             9# define legal(a,b) ((a)>=0&&(a)<w&&(b)>=0&&(b)<h)
            10int chk(int limit)
            11{
            12    memset(map,-1,sizeof(map));
            13    for(int i=0;i<n;i++)
            14        for(int l=0;l<=limit;l++)
            15        {
            16            if(legal(p[i][0]-l,p[i][1]+limit-l))
            17               map[p[i][0]-l][p[i][1]+limit-l]=-2;
            18            if(legal(p[i][0]+l,p[i][1]+limit-l))
            19               map[p[i][0]+l][p[i][1]+limit-l]=-2;
            20            if(legal(p[i][0]-l,p[i][1]-limit+l))
            21               map[p[i][0]-l][p[i][1]-limit+l]=-2;
            22            if(legal(p[i][0]+l,p[i][1]-limit+l))
            23               map[p[i][0]+l][p[i][1]-limit+l]=-2;
            24        }

            25    for(int i=0;i<n;i++)
            26      if(abs(p[i][0]-sx)+abs(p[i][1]-sy)<=limit||abs(p[i][0]-ex)+abs(p[i][1]-ey)<=limit) return -1;
            27    int s=-1,e=-1;
            28    e++;
            29    q[e][0]=sx;
            30    q[e][1]=sy;
            31    map[sx][sy]=0;
            32    while(s!=e)
            33    {
            34       s++;
            35       int x=q[s][0],y=q[s][1];
            36       if(legal(x-1,y)&&map[x-1][y]==-1)
            37       {
            38         e++;
            39         q[e][0]=x-1;
            40         q[e][1]=y;
            41         map[q[e][0]][q[e][1]]=map[x][y]+1;
            42       }

            43       if(legal(x+1,y)&&map[x+1][y]==-1)
            44       {
            45         e++;
            46         q[e][0]=x+1;
            47         q[e][1]=y;
            48         map[q[e][0]][q[e][1]]=map[x][y]+1;
            49       }

            50       if(legal(x,y-1)&&map[x][y-1]==-1)
            51       {
            52         e++;
            53         q[e][0]=x;
            54         q[e][1]=y-1;
            55         map[q[e][0]][q[e][1]]=map[x][y]+1;
            56       }

            57       if(legal(x,y+1)&&map[x][y+1]==-1)
            58       {
            59         e++;
            60         q[e][0]=x;
            61         q[e][1]=y+1;
            62         map[q[e][0]][q[e][1]]=map[x][y]+1;
            63       }

            64    }

            65    return map[ex][ey]==-2||map[ex][ey]==-1?-1:map[ex][ey];
            66}

            67int main()
            68{
            69    int test;
            70    scanf("%d",&test);
            71    while(test--)
            72    {
            73        scanf("%d%d%d%d%d%d%d",&n,&w,&h,&sx,&sy,&ex,&ey);
            74        for(int i=0;i<n;i++)
            75          scanf("%d%d",&p[i][0],&p[i][1]);
            76        int s=0,e=(w>h?w:h)-1;
            77        while(s<=e)
            78        {
            79           int mid=(s+e)>>1;
            80           if(chk(mid)!=-1) s=mid+1;
            81           else e=mid-1;
            82        }

            83        printf("%d %d\n",e+1,chk(e));
            84    }
                
            85    return 0;
            86}

            87

            posted on 2010-12-02 22:47 yzhw 閱讀(265) 評論(0)  編輯 收藏 引用 所屬分類: search

            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導(dǎo)航

            統(tǒng)計

            公告

            統(tǒng)計系統(tǒng)

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲国产另类久久久精品| 波多野结衣久久| 国产无套内射久久久国产| 亚洲国产成人久久综合一区77| 大香伊人久久精品一区二区 | 亚洲精品国产自在久久| 久久永久免费人妻精品下载| 99久久99久久精品国产| 日韩人妻无码一区二区三区久久99| 久久国产精品成人片免费| 久久精品成人| 久久久久国产精品| 亚洲色欲久久久综合网| 久久这里有精品视频| 久久国产精品国产自线拍免费| 国内精品久久久久影院老司| 国产精品久久永久免费| 无码精品久久久天天影视| 久久亚洲国产成人影院网站 | 无码久久精品国产亚洲Av影片| 久久久久亚洲AV成人网| 久久99中文字幕久久| 久久精品黄AA片一区二区三区| 久久伊人中文无码| 久久精品无码av| 久久久久成人精品无码| 久久综合狠狠综合久久激情 | 91精品久久久久久无码| 色欲av伊人久久大香线蕉影院| 一本久久综合亚洲鲁鲁五月天| 国产午夜精品久久久久九九电影 | 日韩欧美亚洲综合久久| 无码8090精品久久一区 | 欧美大香线蕉线伊人久久| 亚洲中文字幕伊人久久无码| 久久综合九色欧美综合狠狠| 国内精品久久久久久不卡影院| 一本伊大人香蕉久久网手机| 国产成人综合久久精品尤物| 久久九色综合九色99伊人| 久久99精品国产99久久6|