• <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)  編輯 收藏 引用 所屬分類: 題目分類:搜索
            一本久久综合亚洲鲁鲁五月天| 精品亚洲综合久久中文字幕| 精品一久久香蕉国产线看播放| 久久99精品国产一区二区三区| 久久久国产精品| 九九精品久久久久久噜噜| 久久综合给合久久狠狠狠97色69 | 久久夜色精品国产噜噜噜亚洲AV| 亚洲AV无码久久| 丁香久久婷婷国产午夜视频| 久久人做人爽一区二区三区 | 国产∨亚洲V天堂无码久久久| 国产精品久久久久久久午夜片| 久久精品国产亚洲av麻豆图片| aaa级精品久久久国产片| 少妇久久久久久被弄到高潮 | 香蕉久久夜色精品国产小说| 久久久久久精品成人免费图片| 99久久成人18免费网站| 午夜精品久久久久久中宇| 婷婷久久综合九色综合绿巨人| 国产精品久久自在自线观看| 国产成人综合久久精品红| 国产ww久久久久久久久久| 99精品久久精品一区二区| 久久这里只精品99re66| 欧洲性大片xxxxx久久久| 99久久国产主播综合精品 | 国产精品激情综合久久| 久久久久亚洲av无码专区喷水 | 久久久亚洲欧洲日产国码是AV| 久久久噜噜噜久久| 成人亚洲欧美久久久久| 青草影院天堂男人久久| 久久se精品一区精品二区| 成人资源影音先锋久久资源网| 久久精品国产第一区二区三区 | 久久婷婷五月综合成人D啪| 无码人妻少妇久久中文字幕| 久久久久亚洲AV综合波多野结衣| 国产免费久久精品丫丫|