• <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 1175 Starry Night 搜索+圖像旋轉、鏡像變換

            好吧,又是網格圖,題目是這樣的,在一個網格圖中求出聯通分量,然后判斷這個圖案之前是否出現過(包括旋轉、鏡像變換)
            求連通分量我就不說了,簡單的DFS,然后變換的時候處理方法是旋轉矩陣r=-c,c=r,對于鏡像變換只要對r或者c取反就可以。然后為了判斷方便,最后進行最小表示,即對連通分量中的點進行排序,并將第一個點的坐標平移到(0,0)
            代碼如下(逐漸喜歡上java寫程序了~)

              1 import java.io.*;
              2 import java.util.*;
              3 public class Main {
              4 
              5     /**
              6      * @param args
              7      */
              8     static class point implements Comparable<point>
              9     {
             10         int r,c;
             11         public int compareTo(point pos)
             12         {
             13             if(r!=pos.r) return r-pos.r;
             14             else return c-pos.c;
             15         }
             16         public point(int rr,int cc)
             17         {
             18             r=rr;
             19             c=cc;
             20         }
             21     }
             22     static class block
             23     {
             24         int num=0;
             25         char sym=0;
             26         ArrayList<point> data=new ArrayList<point>();
             27         ArrayList<point> ori=new ArrayList<point>();
             28         public void sort()
             29         {
             30             Collections.sort(data);
             31             int addr=data.get(0).r,addc=data.get(0).c;
             32             for(point p:data)
             33             {
             34                 p.c-=addc;
             35                 p.r-=addr;
             36             }
             37         }
             38         public boolean equals(block pos)
             39         {
             40             if(num!=pos.num) return false;
             41             for(int i=0;i<data.size();i++)
             42                if(data.get(i).r!=pos.data.get(i).r||data.get(i).c!=pos.data.get(i).c)
             43                    return false;
             44             return true;
             45         }
             46         public void rotate()
             47         {
             48             int tr,tc;
             49             for(point p:data)
             50             {
             51                 tr=p.r;
             52                 tc=p.c;
             53                 p.r=-tc;
             54                 p.c=tr;
             55             }
             56             sort();
             57         }
             58         public void mirror()
             59         {
             60             for(point p:data)
             61                 p.r=-p.r;
             62             sort();
             63         }
             64         
             65     }
             66     static ArrayList<block> refer=new ArrayList<block>();
             67     static int w,h;
             68     static char map[][]=new char[101][101];
             69     static block now;
             70     static void dfs(int r,int c)
             71     {
             72         if(r>=h||r<0||c>=w||c<0||map[r][c]!='1'return;
             73         map[r][c]='0';
             74         now.num++;
             75         now.data.add(new point(r,c));
             76         now.ori.add(new point(r,c));
             77         dfs(r+1,c);
             78         dfs(r-1,c);
             79         dfs(r,c+1);
             80         dfs(r,c-1);
             81         dfs(r+1,c+1);
             82         dfs(r-1,c-1);
             83         dfs(r+1,c-1);
             84         dfs(r-1,c+1);
             85     }
             86     public static void main(String[] args) throws IOException{
             87         BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
             88         w=Integer.parseInt(in.readLine());
             89         h=Integer.parseInt(in.readLine());
             90         for(int i=0;i<h;i++)
             91            map[i]=in.readLine().toCharArray();
             92         char num='a';
             93         for(int i=0;i<h;i++)
             94             for(int j=0;j<w;j++)
             95                 if(map[i][j]=='1')
             96                 {
             97                     boolean flag=false;
             98                     now=new block();
             99                     dfs(i,j);
            100                     now.sort();
            101                     for(int k=0;k<4;k++)
            102                     {
            103                         for(block p:refer)
            104                         {
            105                             if(p.equals(now))
            106                             {
            107                                 flag=true;
            108                                 now.sym=p.sym;
            109                                 break;
            110                             }    
            111                         }
            112                         now.rotate();
            113                     }
            114                     if(!flag)
            115                     {
            116                         now.mirror();
            117                         for(int k=0;k<4&&!flag;k++)
            118                         {
            119                             for(block p:refer)
            120                             {
            121                                 if(p.equals(now))
            122                                 {
            123                                     flag=true;
            124                                     now.sym=p.sym;
            125                                     break;
            126                                 }    
            127                             }
            128                             now.rotate();
            129                         }
            130                     }
            131                     if(!flag)
            132                     {
            133                        now.sym=num++;
            134                        refer.add(now);
            135                     }
            136                     for(point p:now.ori)
            137                             map[p.r][p.c]=now.sym;
            138                 }
            139         for(int i=0;i<h;i++)
            140         {
            141             for(int j=0;j<w;j++)
            142                 System.out.print(map[i][j]);
            143             System.out.println();
            144         }
            145      }
            146 
            147 }
            148 

            posted on 2010-10-16 19:56 yzhw 閱讀(277) 評論(0)  編輯 收藏 引用 所屬分類: search

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            導航

            統計

            公告

            統計系統

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            日本久久久久久久久久| 久久亚洲精品中文字幕| 精品久久久久久无码中文字幕 | 日韩电影久久久被窝网| 一级女性全黄久久生活片免费 | 精品久久人人妻人人做精品 | segui久久国产精品| 久久精品国产精品亜洲毛片| 一本一道久久a久久精品综合| 99999久久久久久亚洲| 一本综合久久国产二区| 久久se精品一区精品二区| 中文字幕无码免费久久| 国产午夜福利精品久久| 国产精品女同久久久久电影院| 精品久久久久久久久久久久久久久 | 久久精品人人做人人爽电影蜜月| 国产免费久久精品丫丫| 人妻久久久一区二区三区| 青春久久| 人妻无码久久精品| 国产成人精品久久综合 | 99久久婷婷国产一区二区| 人妻精品久久久久中文字幕69 | 99久久99久久精品国产片果冻| 国产成人久久777777| AV狠狠色丁香婷婷综合久久| 色综合久久久久综合体桃花网| 色综合久久夜色精品国产| 国产 亚洲 欧美 另类 久久| 午夜不卡888久久| www.久久99| 久久国产乱子精品免费女| 国产国产成人精品久久| 狠狠干狠狠久久| 久久免费美女视频| 欧美日韩中文字幕久久伊人| 亚洲国产精品热久久| 国产—久久香蕉国产线看观看| 亚洲一区中文字幕久久| 久久国产视频网|