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

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲国产精品久久66| 国产成人综合久久精品尤物| 亚洲伊人久久综合中文成人网| 久久影院亚洲一区| 久久久久亚洲av无码专区导航| 久久综合狠狠综合久久激情 | 亚洲国产成人久久综合碰| 久久狠狠高潮亚洲精品| 久久久久久久综合综合狠狠| 欧洲成人午夜精品无码区久久| 久久综合九色综合欧美就去吻| 69国产成人综合久久精品| 国产精品久久久久久久人人看| 久久综合久久久| 人妻丰满AV无码久久不卡| 亚洲va久久久久| 精品久久久久一区二区三区| 99久久精品费精品国产一区二区| 亚洲欧美久久久久9999| 久久国产美女免费观看精品| 国产精品久久久久国产A级| 久久久精品国产免大香伊| 深夜久久AAAAA级毛片免费看| 国产精品内射久久久久欢欢| 大伊人青草狠狠久久| 久久人爽人人爽人人片AV| 亚洲精品乱码久久久久久| 中文字幕无码久久人妻| 香蕉久久影院| 精品久久久久久久久免费影院| 四虎亚洲国产成人久久精品| 看全色黄大色大片免费久久久 | 久久精品免费一区二区| 久久国产香蕉视频| 久久久久久久国产免费看| 精品久久久无码中文字幕天天| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品99久久不卡| 99久久夜色精品国产网站| 久久久无码精品亚洲日韩软件| 欧美久久亚洲精品|