• <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
            此題的意思就是在用‘.’和‘#’組成的圖形中,有多少個長方形。這類問題最容易想到的方法就是BFS,這題我依然按照這個思路去想。

             

            利用BFS很容易得出有多少個由 # 組成的圖形,問題的關鍵成為了如何判斷一個圖形是否是長方形。

            如下圖形:

            . . . .

            ##. .

            ##. .

            . . . .

            一眼即可看出它是個長方形(廢話)。

            再看另一個:

            . . . .

            ## . .

            ### .

            . . . .

            它不是一個長方形。

            如果注意到兩個圖形的行坐標的最大值最小值、列坐標的最大值最小值與圖形的面積之間的關系,我們很容易想出來一個算法。

            (xmax-xmin+1)*(ymax-ymin+1)==area

            是一個長方形;

            否則不是。

            時間復雜度O(rc)1000*1000的數據規模完全可以承受。

            此題還有其他解法。

            這種方法很好理解,但是程序有點長,因為涉及到BFS

            Ps:另外說明一下BFS應該由一個點出發向8個點搜索,題目中說的不是太清楚。這一點我也是看了測試數據才知道。

             

            以下是我的程序:

            #include<stdio.h>
            #define min(a,b) (a<b?a:b)
            #define max(a,b) (a>b?a:b)
            typedef 
            struct
            {
                
            long front,rear,count,x[100000],y[100000];
            }
            Queue;
            char map[1001][1001];
            long r,c;
            long id[]={-1,-1,0,1,1,1,0,-1};
            long jd[]={0,1,1,1,0,-1,-1,-1};
            int used[1001][1001]={0};
            void clear(Queue *q)
            {
                q
            ->count=0;
                q
            ->front=0;
                q
            ->rear=-1;
            }

            void put(Queue *q,long a,long b)
            {
                q
            ->count++;
                q
            ->rear++;
                q
            ->x[q->rear]=a;
                q
            ->y[q->rear]=b;
            }

            void get(Queue *q,long *a,long *b)
            {
                q
            ->count--;
                
            *a=q->x[q->front];
                
            *b=q->y[q->front];
                q
            ->front++;
            }

            int empty(Queue *q)
            {
                
            return (q->count<=0);
            }

            long bfs1()
            {
                
            long i,j,re=0;
                
            for(i=0;i<r;i++)
                  
            for(j=0;j<c;j++)
                    
            if(map[i][j]=='#')
                      re
            ++;
                
            return re;
            }

            long bfs2(long *ans)
            {
                
            long i,j,k,t1,t2,re=0,xmin,xmax,ymin,ymax,flag;
                Queue A;
                clear(
            &A);
                
            for(i=0;i<r;i++)
                  
            for(j=0;j<c;j++)
                  
            {
                     flag
            =0;
                     
            if(map[i][j]=='#'&&!used[i][j])
                     
            {
                        put(
            &A,i,j);
                        xmin
            =xmax=i;
                        ymin
            =ymax=j;
                        flag
            =1;
                     }

                     
            while(!empty(&A))
                     
            {
                        
            get(&A,&t1,&t2);
                        
            if(!used[t1][t2])
                        
            {
                           used[t1][t2]
            =1;
                           xmin
            =min(xmin,t1);
                           xmax
            =max(xmax,t1);
                           ymin
            =min(ymin,t2);
                           ymax
            =max(ymax,t2);
                           
            for(k=0;k<8;k++)
                             
            if(t1+id[k]>=0&&t1+id[k]<r&&t2+jd[k]>=0&&t2+jd[k]<c&&!used[t1+id[k]][t2+jd[k]]&&map[t1+id[k]][t2+jd[k]]=='#')
                               put(
            &A,t1+id[k],t2+jd[k]);
                        }

                     }

                     
            if(flag)
                     
            {
                        re
            += (xmax-xmin+1)*(ymax-ymin+1);
                        (
            *ans)++;
                     }

                  }

                
            return re;
            }

            int main()
            {
                FILE 
            *fin,*fout;
                fin
            =fopen("battle.in","r");
                
            long i,j,area1,area2,ans=0;
                fscanf(fin,
            "%ld%ld",&r,&c);
                
            for(i=0;i<r;i++)
                  fscanf(fin,
            "%s",map[i]);
                fclose(fin);
            //------Read In
                area1=bfs1();
                area2
            =bfs2(&ans);
                fout
            =fopen("battle.out","w");
                
            if(area1!=area2)
                  fprintf(fout,
            "Bad placement.\n");
                
            else
                  fprintf(fout,
            "There are %ld ships.\n",ans);
                fclose(fout);
            return 0;
            }

            posted on 2010-01-06 18:46 lee1r 閱讀(405) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            99久久国产精品免费一区二区| 国产精品久久精品| 久久久噜噜噜久久中文字幕色伊伊| 久久天天躁狠狠躁夜夜2020一| 狠狠色婷婷久久一区二区三区| 久久综合久久综合久久综合| 三级片免费观看久久| 91久久精一区二区三区大全| 欧美午夜A∨大片久久| 潮喷大喷水系列无码久久精品| 亚洲精品美女久久久久99小说| 久久精品国产亚洲av麻豆小说| 久久亚洲高清综合| 久久99国产精品99久久| 欧美精品九九99久久在观看| 日韩欧美亚洲综合久久影院d3| 影音先锋女人AV鲁色资源网久久| 国产综合精品久久亚洲| 狠狠干狠狠久久| 996久久国产精品线观看| 伊人久久久AV老熟妇色| 久久久久99这里有精品10 | 久久国产精品免费| 婷婷综合久久狠狠色99h| 亚洲狠狠婷婷综合久久久久| 伊人久久大香线蕉无码麻豆| 欧美一级久久久久久久大| 99久久99久久精品国产片| 久久久久久久综合日本亚洲| 久久久久人妻一区二区三区vr | 思思久久精品在热线热| 日韩亚洲国产综合久久久| 国产午夜精品久久久久九九电影| 精品国产VA久久久久久久冰| 97精品久久天干天天天按摩| 国产精品对白刺激久久久| 久久发布国产伦子伦精品| 国产精品久久波多野结衣| 精品999久久久久久中文字幕| 精品免费tv久久久久久久| 91精品无码久久久久久五月天|