• <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 搜索+圖像旋轉(zhuǎn)、鏡像變換

            好吧,又是網(wǎng)格圖,題目是這樣的,在一個網(wǎng)格圖中求出聯(lián)通分量,然后判斷這個圖案之前是否出現(xiàn)過(包括旋轉(zhuǎn)、鏡像變換)
            求連通分量我就不說了,簡單的DFS,然后變換的時候處理方法是旋轉(zhuǎn)矩陣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 閱讀(271) 評論(0)  編輯 收藏 引用 所屬分類: search

            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計

            公告

            統(tǒng)計系統(tǒng)

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲成av人片不卡无码久久| 人妻无码αv中文字幕久久琪琪布| 色婷婷久久综合中文久久蜜桃av| 亚洲AV无码一区东京热久久| 精品久久久久久国产91| 国产亚洲美女精品久久久| 久久精品国产72国产精福利| 久久99热这里只有精品国产| 国内精品久久久久| 久久天天躁狠狠躁夜夜躁2014| www.久久热| 99久久精品免费看国产一区二区三区| 奇米综合四色77777久久| 精品久久国产一区二区三区香蕉| 精品久久久久久国产| 精品熟女少妇aⅴ免费久久| 无码专区久久综合久中文字幕| 久久综合综合久久97色| 久久精品国产亚洲AV久| 久久狠狠一本精品综合网| 久久99精品久久久久子伦| 国产精品一区二区久久精品涩爱| 秋霞久久国产精品电影院| 久久夜色精品国产噜噜亚洲AV| 亚洲午夜无码AV毛片久久| 久久精品国产亚洲综合色| 亚洲AV乱码久久精品蜜桃| 久久综合久久伊人| 久久精品国产黑森林| 99久久免费只有精品国产| 精品久久久无码人妻中文字幕豆芽| 精品国产乱码久久久久软件| 久久影院午夜理论片无码| 超级碰久久免费公开视频| 久久婷婷国产麻豆91天堂| 久久se精品一区精品二区| 国产一久久香蕉国产线看观看 | 99久久亚洲综合精品网站| 久久av无码专区亚洲av桃花岛| 97精品依人久久久大香线蕉97| 伊色综合久久之综合久久|