• <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 閱讀(392) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            国产成人精品久久免费动漫| 久久人人爽人人爽人人片AV东京热 | 久久亚洲日韩精品一区二区三区| 国产成人精品综合久久久| 亚洲精品乱码久久久久久中文字幕| 国产精品禁18久久久夂久| 国产精品永久久久久久久久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久久久午夜成人影院| 99热热久久这里只有精品68| 日韩欧美亚洲综合久久| 成人国内精品久久久久影院VR| 中文成人无码精品久久久不卡 | 久久久久噜噜噜亚洲熟女综合| 麻豆亚洲AV永久无码精品久久| 久久这里有精品视频| 久久精品成人国产午夜| 亚洲中文字幕无码久久2017| 久久久噜噜噜久久| 一本久久久久久久| 久久久一本精品99久久精品66| 久久受www免费人成_看片中文| 99久久精品九九亚洲精品| 国内精品人妻无码久久久影院| 国产精品久久久久蜜芽| 久久精品99无色码中文字幕| 国产精品久久久久久久午夜片 | 狠狠色丁香久久婷婷综合蜜芽五月| 国产亚洲欧美成人久久片| 亚洲精品国产美女久久久| 久久香综合精品久久伊人| 伊人精品久久久久7777| 久久国产高清一区二区三区| 97精品伊人久久久大香线蕉| 91久久精品国产成人久久| 久久国产精品久久精品国产| 国内精品久久久久| 国内精品久久久久久久影视麻豆| 久久久国产精华液| 热久久视久久精品18| 精产国品久久一二三产区区别|