• 海岛问题


    问题描述:

    You will be given a map of Soteholm as an N×M grid. Each square in the grid has a side length of 1 km and is either water or land. Your goal is to compute the total length of sea coast of all islands. Sea coast is all borders between land and sea, and sea is any water connected to an edge of the map only through water. Two squares are connected if they share an edge. You may assume that the map is surrounded by sea. Lakes and islands 
    in lakes are not contributing to the sea coast.

    Figure 1: 
    Gray squares are land and white squares are water. The thick black line is the sea coast. This example corresponds to Sample Input 1.

    Input

    The first line of the input contains two space separated integers N and M where 1 ≤ N, M ≤ 1000. The following N lines each contain a string of length M consisting of only zeros and ones. Zero means water and one means land.

    Input

    The first line of the input contains two space separated integers N and M where 1 ≤ N, M ≤ 1000. The following N lines each contain a string of length M consisting of only zeros and ones. Zero means water and one means land.

    Output

    Output one line with one integer, the total length of the coast in km.

    Sample Input 1

    5 6 
    011110
    010110 
    111000
    000010 
    000000 

    Sample Output 1

    20

    算法简析:

        该问题的关键就是如何区分海洋和湖泊。所求的长度即为陆地和海洋相邻的边的长度,即海岸线长度。

        如何区分呢? 我们看最边上的有水的地方必为海洋。 如果一个水快可以通过连续查找相邻水域,相邻水域中若有任一边缘水域块,即整块水域为海洋。

        否则整块水域其为湖泊。

    代码实现:

      1 import java.util.HashMap;
      2 import java.util.Map;
      3 
      4 import javax.swing.text.html.HTMLDocument.Iterator;
      5 
      6 
      7 public class LandCount {
      8     
      9     
     10     public static void main (String argv[]){
     11         
     12         int[][] m; int leng=0;
     13         m= new int[6][];
     14         for(int i=0;i<6;i++)
     15           m[i]=new int[6];
     16         for(int i=0;i<6;i++){
     17             for(int j=0;j<6;j++){
     18                 m[i][j]=0;
     19             }
     20         }
     21         m[0][1]=1;m[0][2]=1;m[0][3]=1;m[0][4]=1;
     22         m[1][1]=1;m[1][3]=1;m[1][4]=1;
     23         m[2][0]=1;m[2][1]=1;m[2][2]=1;
     24         m[3][4]=1;
     25         for(int i=0;i<6;i++){
     26             for(int j=0;j<6;j++){
     27                 System.out.print(" "+m[i][j]);
     28             }
     29             System.out.println();
     30         }
     31         for(int i=0;i<=5;i++){
     32             for(int j=0;j<=5;j++){
     33                 //System.out.println("i j m[i][j] "+i+j+m[i][j]);
     34                 if(m[i][j]==0){        
     35                     System.out.println(".........."+i+j);
     36                     check(m,i,j);
     37                     /*for(int q=0;q<6;q++){
     38                     for(int w=0;w<6;w++){
     39                         System.out.print(" "+m[q][w]);
     40                     }
     41                     System.out.println();
     42                 }*/
     43                 
     44                 }
     45                 
     46             }
     47             
     48         }
     49         for(int i=0;i<6;i++){
     50             for(int j=0;j<6;j++){
     51                 System.out.print(" "+m[i][j]);
     52                 
     53             }
     54             System.out.println();
     55         }
     56         for(int i=0;i<5;i++){
     57             for(int j=0;j<5;j++){
     58                 if(m[i][j]==1){    
     59                     
     60                     if(i==0||i==5) leng++;
     61                     if(j==0||j==5) leng++;
     62                     if(i>=1){
     63                         if(m[i-1][j]==2)
     64                             leng++;
     65                     }                
     66                     if(i+1<6){
     67                         if(m[i+1][j]==2)
     68                             leng++;
     69                     }
     70                     if(j>=1){
     71                         if(m[i][j-1]==2)
     72                             leng++;
     73                     }
     74                     if(j+1<6){
     75                         if(m[i][j+1]==2)
     76                             leng++;
     77                             
     78                     }
     79                 }
     80             }
     81         }    
     82         System.out.println("边界线:"+leng);
     83     }
     84     
     85     
     86     public static  int checkTwo(kv[] s, int num, int u, int v){
     87        int i=0;
     88        for(int p=0;p<num;p++){
     89            
     90         if(s[p].x==u&&s[p].y==v){
     91             i=1; break;
     92         }
     93             
     94         
     95     }
     96 
     97        return i;
     98     }
     99     public static  void check(int[][] l, int i, int j){
    100         
    101         
    102         
    103         kv [] s=new kv[36];
    104         for(int x=0;x<36;x++){
    105             
    106             s[x]=new kv();
    107             //System.out.print(s[x].x);
    108             //System.out.print(s[x].y);
    109         }    
    110         System.out.println();
    111         s[0].x=i;
    112         s[0].y=j;
    113         int num=1; int bz=0;
    114         for(int m=0;m<num;m++){            
    115             int u=s[m].x;
    116             int v=s[m].y;
    117             System.out.print(u);
    118             System.out.println(v);
    119             if(u>=1){
    120             if(l[u-1][v]==0){    
    121                 
    122                 if(checkTwo(s,num,u-1,v)==0){
    123                     
    124                     s[num].x=u-1;
    125                     s[num].y=v;
    126                     if(u-1==0||v==0||u-1==5||v==5)
    127                         bz++;
    128                     num++;    
    129                 }         
    130                  }
    131             }
    132             //System.out.println("num:"+num);
    133             if(u+1<=5){
    134             if(l[u+1][v]==0){
    135                 
    136                 if(checkTwo(s,num,u+1,v)==0){
    137                     
    138                     s[num].x=u+1;
    139                     s[num].y=v;
    140                     if(u+1==0||v==0||u+1==5||v==5)
    141                         bz++;
    142                     num++;    
    143                 }
    144                  }
    145             }
    146             //System.out.println("num:"+num);
    147             if(v>=1){
    148             if(l[u][v-1]==0){
    149                 
    150                 if(checkTwo(s,num,u,v-1)==0){
    151                     
    152                     s[num].x=u;
    153                     s[num].y=v-1;
    154                     if(u==0||v-1==0||u==5||v-1==5)
    155                         bz++;
    156                     num++;    
    157                 }
    158                  }
    159             }
    160             //System.out.println("num:"+num);
    161             if(v+1<=5){
    162             if(l[u][v+1]==0){
    163                 
    164                 if(checkTwo(s,num,u,v+1)==0){                    
    165                     s[num].x=u;
    166                     s[num].y=v+1;
    167                     if(u==0||v+1==0||u==5||v+1==5)
    168                         bz++;
    169                     num++;    
    170                 }
    171                  }
    172             }    
    173            //    System.out.println("num:"+num);
    174         }
    175         //System.out.println("num:"+num+"bz"+bz);
    176         if(bz>=1){
    177             System.out.println("They are 海洋:"+num+"块!!!");
    178             for(int t=0;t<num;t++){
    179                 int s_r=s[t].x;
    180                 int s_l=s[t].y;
    181                 l[s_r][s_l]=2;
    182                 //System.out.println("chang"+s_r+s_l+l[s_r][s_l]);
    183                 
    184             }
    185             
    186         }
    187         else
    188             System.out.println("They are 湖泊:"+num+"块!!!");
    189         
    190     }
    191 
    192 
    193 
    194 static  class kv{
    195         
    196         public int x;
    197         
    198         public int y;
    199         
    200         public  kv(){
    201             this.x=10;
    202             this.y=10;
    203             
    204         }
    205     }
    206 }
    View Code

    有其引发出一小游戏: 即类似扫雷,在水域上随意添加陆地,然后计算海洋个数,湖泊个数和陆地边界线长度。

      1 import java.awt.*;
      2 import java.awt.event.ActionEvent;
      3 import java.awt.event.ActionListener;
      4 
      5 import javax.swing.*; 
      6 import javax.swing.*; 
      7 
      8 public class Haidao extends JFrame {
      9     
     10  JButton random,clear,check;
     11  JTextField Checkout; 
     12  ls[] B_ui;
     13  public Haidao() {
     14      
     15      random=new JButton("Random");    
     16      clear=new JButton("Clear");
     17      check=new JButton("Check");
     18      B_ui=new ls[100];
     19      Checkout = new JTextField(20); 
     20      check.addActionListener(new ConcludeAction(B_ui,Checkout));
     21      clear.addActionListener(new ClearAction(B_ui));
     22      for(int i=0;i<100;i++){
     23          
     24          B_ui[i]= new ls(0);
     25          B_ui[i].Button.addActionListener(new ChangeAction(B_ui[i]));
     26      }
     27      
     28     JPanel container1 = new JPanel();
     29     container1.setLayout(new GridLayout(1,4,5,5)); 
     30     JPanel container2 = new JPanel();
     31     container2.setLayout(new GridLayout(10,10,1,1));
     32     container1.setSize(600, 800); 
     33     container1.setSize(600, 100); 
     34     for(int i=0;i<100;i++){
     35          
     36         container2.add(B_ui[i].Button); 
     37      }
     38     container1.add(random);
     39     container1.add(clear);
     40     container1.add(check);
     41     container1.add(Checkout);
     42     setLayout(new GridLayout(2,1,10,10));
     43     getContentPane().add(container2);
     44     getContentPane().add(container1);
     45     setVisible(true);  
     46  }
     47 public class ChangeAction implements ActionListener {
     48         public ls buttoni;
     49         public void actionPerformed(ActionEvent e) {
     50             buttoni.x=(buttoni.x+1)%2;
     51             if(buttoni.x==1)
     52             buttoni.Button.setBackground(Color.green);
     53             if(buttoni.x==0)
     54                 buttoni.Button.setBackground(Color.white);
     55         }
     56         public  ChangeAction(ls button) {
     57             buttoni=button;
     58         }
     59     }    
     60  public class ConcludeAction implements ActionListener {
     61         public JTextField textC;
     62         public ls[] buttons;
     63         public String  Out;
     64         public String  huOut;
     65         public String  haiOut;
     66         public int huid=0;
     67         public int haiid=0;
     68     public void actionPerformed(ActionEvent e) {
     69             
     70             int[][] m; int leng=0;int BuiN=0;
     71             m= new int[10][];
     72             for(int i=0;i<10;i++)
     73               m[i]=new int[10];
     74             for(int i=0;i<10;i++){
     75                 for(int j=0;j<10;j++){
     76                     m[i][j]=buttons[BuiN].x;
     77                     System.out.print(m[i][j]);
     78                     BuiN++;
     79                 }
     80                 System.out.println();
     81             }
     82             for(int i=0;i<10;i++){
     83                 for(int j=0;j<10;j++){
     84                     if(m[i][j]==0){        
     85                         check(m,i,j,Out);                            
     86                     }
     87                 }
     88             }
     89             BuiN=0;
     90             for(int i=0;i<10;i++){
     91                 for(int j=0;j<10;j++){
     92                     buttons[BuiN].x=m[i][j];
     93                     buttons[BuiN].setColour();                       
     94                     BuiN++;
     95                 }
     96             }
     97             for(int i=0;i<=9;i++){
     98                 for(int j=0;j<=9;j++){
     99                     if(m[i][j]==1){    
    100                         
    101                         if(i==0||i==9) leng++;
    102                         if(j==0||j==9) leng++;
    103                         if(i>=1){
    104                             if(m[i-1][j]==2)
    105                                 leng++;
    106                         }                
    107                         if(i+1<=9){
    108                             if(m[i+1][j]==2)
    109                                 leng++;
    110                         }
    111                         if(j>=1){
    112                             if(m[i][j-1]==2)
    113                                 leng++;
    114                         }
    115                         if(j+1<=9){
    116                             if(m[i][j+1]==2)
    117                                 leng++;
    118                                 
    119                         }
    120                     }
    121                 }
    122             }
    123             
    124             Out=haiOut+huOut;
    125             Out=Out+"边界线length:"+leng;
    126             textC.setText(Out);
    127             Out="";
    128             haiOut="";
    129             huOut="";
    130             huid=0;
    131             haiid=0;
    132             //Out=Out+"边界线length:"+leng;
    133             
    134         }        
    135     public  ConcludeAction(ls[] button,JTextField textfile) {
    136             buttons=button;
    137             textC=textfile;
    138             this.Out="";
    139             this.haiOut="";
    140             this.huOut="";
    141         }
    142     public   int checkTwo(kv[] s, int num, int u, int v){
    143                int i=0;
    144                for(int p=0;p<num;p++){
    145                 if(s[p].x==u&&s[p].y==v){
    146                     i=1; break;
    147                 }
    148             }
    149 
    150                return i;
    151             }
    152     public   void check(int[][] l, int i, int j,String Out){
    153         
    154                 kv [] s=new kv[100];
    155                 for(int x=0;x<100;x++){
    156                     
    157                     s[x]=new kv();
    158                     
    159                 }    
    160                 System.out.println();
    161                 s[0].x=i;
    162                 s[0].y=j;
    163                 int num=1; int bz=0;
    164                 for(int m=0;m<num;m++){            
    165                     int u=s[m].x;
    166                     int v=s[m].y;
    167                     System.out.print(u);
    168                     System.out.println(v);
    169                     if(u>=1){
    170                     if(l[u-1][v]==0){    
    171                         
    172                         if(checkTwo(s,num,u-1,v)==0){
    173                             
    174                             s[num].x=u-1;
    175                             s[num].y=v;
    176                             if(u-1==0||v==0||u-1==9||v==9)
    177                                 bz++;
    178                             num++;    
    179                         }         
    180                          }
    181                     }
    182                     if(u+1<=9){
    183                     if(l[u+1][v]==0){
    184                         
    185                         if(checkTwo(s,num,u+1,v)==0){
    186                             
    187                             s[num].x=u+1;
    188                             s[num].y=v;
    189                             if(u+1==0||v==0||u+1==9||v==9)
    190                                 bz++;
    191                             num++;    
    192                         }
    193                          }
    194                     }
    195                     if(v>=1){
    196                     if(l[u][v-1]==0){
    197                         
    198                         if(checkTwo(s,num,u,v-1)==0){
    199                             
    200                             s[num].x=u;
    201                             s[num].y=v-1;
    202                             if(u==0||v-1==0||u==9||v-1==9)
    203                                 bz++;
    204                             num++;    
    205                         }
    206                          }
    207                     }
    208                     if(v+1<=9){
    209                     if(l[u][v+1]==0){
    210                         
    211                         if(checkTwo(s,num,u,v+1)==0){                    
    212                             s[num].x=u;
    213                             s[num].y=v+1;
    214                             if(u==0||v+1==0||u==9||v+1==9)
    215                                 bz++;
    216                             num++;    
    217                         }
    218                       }
    219                     }    
    220                 }
    221                 if(bz>=1){
    222                     haiid++;
    223                     haiOut=haiOut+"海洋"+haiid+"号: 面积为"+num+"! ";
    224                     System.out.println("海洋"+haiid+"号:"+num+"块!!!");
    225                     for(int t=0;t<num;t++){
    226                         int s_r=s[t].x;
    227                         int s_l=s[t].y;
    228                         buttons[10*s_r+s_l].setColour();
    229                         buttons[10*s_r+s_l].Button.setLabel(""+haiid);    
    230                         Font font=new Font("楷体",Font.PLAIN,24);                    
    231                         buttons[10*s_r+s_l].Button.setFont(font);
    232                         buttons[10*s_r+s_l].Button.setForeground(Color.blue);    
    233                         //buttons[10*s_r+s_l].Button.
    234                         l[s_r][s_l]=2;
    235                     }                    
    236                 }
    237                 else{
    238                     huid++;
    239                     huOut=huOut+"湖泊"+huid+"号:"+num+"块!!!"+"
    ";
    240                     System.out.println("湖泊"+huid+"号: 面积为"+num+"! ");
    241                     for(int t=0;t<num;t++){
    242                         int s_r=s[t].x;
    243                         int s_l=s[t].y;
    244                         buttons[10*s_r+s_l].setColour();
    245                         buttons[10*s_r+s_l].Button.setLabel(""+huid);    
    246                         Font font=new Font("楷体",Font.PLAIN,24);                    
    247                         buttons[10*s_r+s_l].Button.setFont(font);
    248                         buttons[10*s_r+s_l].Button.setForeground(Color.white);
    249                     }                    
    250                 }
    251                     
    252                     
    253             }
    254 
    255 
    256 
    257     public  class kv{
    258                 
    259                 public int x;
    260                 
    261                 public int y;
    262                 
    263                 public  kv(){
    264                     this.x=100;
    265                     this.y=100;
    266                     
    267                 }
    268             }
    269         
    270     }    
    271 public class ClearAction implements ActionListener {
    272         
    273         public ls[] buttons;
    274         public void actionPerformed(ActionEvent e) {
    275             
    276             for(int i=0;i<100;i++)
    277             {    
    278                 System.out.print(" "+buttons[i].x);
    279                 buttons[i].x=0;
    280                 buttons[i].Button.setBackground(Color.white);
    281                 buttons[i].Button.setText("");
    282                 }
    283         }        
    284         public  ClearAction(ls[] button) {
    285             buttons=button;
    286         }
    287         
    288     }    
    289     
    290 public class ls extends JFrame{
    291         
    292         JButton Button = new JButton(""); 
    293         int x; //湖泊陆地海洋标志
    294         int id; //地块或海洋号码
    295         public void setColour (){
    296             if(x==0)
    297                 Button.setBackground(Color.gray);
    298             if(x==1)
    299                 Button.setBackground(Color.green);
    300             if(x==2)
    301                 Button.setBackground(Color.white);
    302             //Button.setText(""+id);
    303         }
    304         public ls(int i){
    305             this.x=i;
    306             Button.setBackground(Color.white);
    307             
    308         }
    309     }
    310     
    311     
    312 public static void main(String argv[]){
    313         
    314         new Haidao();
    315     }
    316     
    317 
    318 }
    View Code

    效果演示:

    因时间问题,未细究其时间优化问题,代码有点粗糙,勿怪。

  • 相关阅读:
    poj 1200 crasy search
    cdoj 1092 韩爷的梦
    fzu 2257 saya的小熊饼干
    zoj 3950 how many nines
    zoj 3963 heap partion
    fzu 2256 迷宫
    fzu 2253 salty fish
    hdu 2473 Junk-Mail Filter
    codeforces 129B students and shoes
    hdu 3367 Pseudoforest
  • 原文地址:https://www.cnblogs.com/udld/p/4161679.html
Copyright © 2020-2023  润新知