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

            USACO Section 2.4 Overfencing

            Overfencing

            Kolstad and Schrijvers

            Farmer John went crazy and created a huge maze of fences out in a field. Happily, he left out two fence segments on the edges, and thus created two "exits" for the maze. Even more happily, the maze he created by this overfencing experience is a `perfect' maze: you can find a way out of the maze from any point inside it.

            Given W (1 <= W <= 38), the width of the maze; H (1 <= H <= 100), the height of the maze; 2*H+1 lines with width 2*W+1 characters that represent the maze in a format like that shown later - then calculate the number of steps required to exit the maze from the `worst' point in the maze (the point that is `farther' from either exit even when walking optimally to the closest exit). Of course, cows walk only parallel or perpendicular to the x-y axes; they do not walk on a diagonal. Each move to a new square counts as a single unit of distance (including the move "out" of the maze.

            Here's what one particular W=5, H=3 maze looks like:

            +-+-+-+-+-+
            |         |
            +-+ +-+ + +
            |     | | |
            + +-+-+ + +
            | |     |
            +-+ +-+-+-+
            

            Fenceposts appear only in odd numbered rows and and odd numbered columns (as in the example). The format should be obvious and self explanatory. Each maze has exactly two blank walls on the outside for exiting.

            PROGRAM NAME: maze1

            INPUT FORMAT

            Line 1: W and H, space separated
            Lines 2 through 2*H+2: 2*W+1 characters that represent the maze

            SAMPLE INPUT (file maze1.in)

            5 3
                +-+-+-+-+-+
                |         |
                +-+ +-+ + +
                |     | | |
                + +-+-+ + +
                | |     |
                +-+ +-+-+-+
                

            OUTPUT FORMAT

            A single integer on a single output line. The integer specifies the minimal number of steps that guarantee a cow can exit the maze from any possible point inside the maze.

            SAMPLE OUTPUT (file maze1.out)

            9
                
            The lower left-hand corner is *nine* steps from the closest exit.

            Analysis

            We can solve this with a standard flood fill, using a queue to implement breadth first search. It is convenient to leave the maze in its ASCII format and just look at it as a bunch of characters, with non-space characters being walls.


            Code
            /*
            ID: braytay1
            PROG: maze1
            LANG: C++
            */

            #include 
            <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <assert.h>
            #include 
            <algorithm>
            #include 
            <queue>
            using namespace std;
            queue
            <int> qq;
            int W,H;
            char map[202][80];
            int tracy[202][80][2];
            int x1=-1,y1=-1,x2=-1,y2=-1;
            bool isIn(int x,int y){
                
            if (x<=0||x>=2*H||y<=0||y>=2*W) return false;
                
            else return true;
            }

            void BFS(int tra){
                
            int col,row,s;
                
            while (!qq.empty()){
                    col
            =qq.front();
                    qq.pop();
                    row
            =qq.front();
                    qq.pop();
                    s
            =qq.front();
                    qq.pop();
                    
            if (tracy[col][row][tra]>0continue;
                    tracy[col][row][tra]
            =s;
                    
            if (map[col-1][row]!='-'&&isIn(col-2,row)) {qq.push(col-2);qq.push(row);qq.push(s+1);}
                    
            if (map[col+1][row]!='-'&&isIn(col+2,row)) {qq.push(col+2);qq.push(row);qq.push(s+1);}
                    
            if (map[col][row-1]!='|'&&isIn(col,row-2)) {qq.push(col);qq.push(row-2);qq.push(s+1);}
                    
            if (map[col][row+1]!='|'&&isIn(col,row+2)) {qq.push(col);qq.push(row+2);qq.push(s+1);}
                }

            }

            int max(int a[202][80][2],int tra,int h,int w){
                
            int maximum=-1;
                
            for (int i=0;i<h;i++){
                    
            for (int j=0;j<w;j++){
                        
            if (maximum<a[i][j][tra]) maximum=a[i][j][tra];
                    }

                }

                
            return maximum;
            }


            int main(){
                
            //Initialize
                FILE *fin, *fout;
                fin 
            = fopen("maze1.in""r");
                fout 
            = fopen("maze1.out""w");
                assert(fin 
            != NULL && fout != NULL);
                fscanf(fin,
            "%d %d\n",&W,&H);
                
            for (int i=0;i<=2*H;i++){
                    fgets(map[i], 
            sizeof(map[i]), fin);
                }

                memset(tracy,
            -1,sizeof(tracy));
                
            //edge search
                for (int i=0;i<=2*W;i++){
                    
            if (map[0][i]!='+'&&map[0][i]!='-'{
                        
            if (x1==-1&&y1==-1{x1=1;y1=i;}
                        
            else {x2=1;y2=i;}
                    }

                    
            if (map[2*H][i]!='+'&&map[2*H][i]!='-'{
                        
            if (x1==-1&&y1==-1{x1=2*H-1;y1=i;}
                        
            else {x2=2*H-1;y2=i;}
                    }

                }

                
            for (int i=0;i<=2*H;i++){
                    
            if (map[i][0]!='+'&&map[i][0]!='|'{
                        
            if (x1==-1&&y1==-1{x1=i;y1=1;}
                        
            else {x2=i;y2=1;}
                    }

                    
            if (map[i][2*W]!='+'&&map[i][2*W]!='|'{
                        
            if (x1==-1&&y1==-1{x1=i;y1=2*W-1;}
                        
            else {x2=i;y2=2*W-1;}
                    }

                }

                qq.push(x1);qq.push(y1);qq.push(
            1);
                BFS(
            0);
                qq.push(x2);qq.push(y2);qq.push(
            1);
                BFS(
            1);
                
            for (int i=0;i<=2*H;i++){
                    
            for (int j=0;j<=2*W;j++){
                        
            int a1,a2;
                        a1
            =tracy[i][j][0];
                        a2
            =tracy[i][j][1];
                        tracy[i][j][
            0]=(a1<a2)?a1:a2;
                    }

                }

                
            int res;
                res
            =max(tracy,0,2*H+1,2*W+1);
                
            //Output
                fprintf(fout, "%d\n", res);
                
            return 0;
            }

            posted on 2008-08-15 16:55 幻浪天空領(lǐng)主 閱讀(148) 評論(0)  編輯 收藏 引用 所屬分類: USACO

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆檔案(2)

            文章分類(23)

            文章檔案(22)

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            99精品久久精品一区二区| 久久91综合国产91久久精品| 久久93精品国产91久久综合| 国产亚洲色婷婷久久99精品91| 中文精品99久久国产 | 久久这里有精品视频| 一本色综合久久| 久久中文字幕一区二区| 偷偷做久久久久网站| 国产精品久久久久9999高清| 欧美亚洲日本久久精品| 久久精品中文字幕无码绿巨人| 亚洲综合婷婷久久| 97久久国产综合精品女不卡| 青青青伊人色综合久久| 亚洲精品国精品久久99热一| 亚洲乱亚洲乱淫久久| 久久天堂AV综合合色蜜桃网| 欧美午夜精品久久久久久浪潮| 国产精品一久久香蕉国产线看观看| 亚洲国产成人精品女人久久久| 精品综合久久久久久97超人| 伊人久久无码精品中文字幕| 国产精品综合久久第一页| 狠狠干狠狠久久| 97久久超碰成人精品网站| 亚洲色欲久久久综合网 | 人妻少妇久久中文字幕| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久国产色AV免费看| 久久笫一福利免费导航| 四虎亚洲国产成人久久精品| 国产精品gz久久久| 久久人妻少妇嫩草AV无码蜜桃 | 2020久久精品亚洲热综合一本| 思思久久99热免费精品6| 久久99精品国产麻豆不卡| 韩国三级中文字幕hd久久精品 | 亚洲成色www久久网站夜月| 久久久www免费人成精品| 亚洲欧美一区二区三区久久|