海岛问题之Java实现

问题描述:

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 }

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

  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+"块!!!"+"\r";
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 }

效果演示:

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

时间: 2024-10-10 14:55:53

海岛问题之Java实现的相关文章

Chapter 1 Java开发前奏

第1章:初识Java 1.1 计算机的基础知识 1.1.1 计算机 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机.常见的形式有台式计算机.笔记本计算机.大型计算机等. 计算机的应用已渗透到社会的各个领域,正在改变着人们的工作.学习和生活的方式,推动着社会的发展.哪些方面? 1:科学计算 科学计算也称数值计算.计算机最开始是为解决科学研究和工程设计中遇到的大量数学问题的

菜鸟笔记 -- Chapter 3.2 Java简介

3.2 Java简介 Java是一种高级的面向对象的程序设计语言.使用Java语言编写的程序是跨平台的,从PC机到手持电脑都有Java开发的程序和游戏,Java程序可以在任何计算机.操作系统和支持Java的硬件设备上运行. 3.2.1 Java语言的历史 Java语言是Sun公司于1990年开发的,当时Green项目小组的研究人员正在致力于为未来的智能设备开发一种新的编程语言.由于该小组的成员James Gosling 对C++语言在执行过程中的表现非常不满,就把自己封闭在办公室里编写了一种新的

9月最新184道阿里、百度、腾讯、头条Java面试题合集

阿里面试题 1. 如何实现一个高效的单向链表逆序输出? 2. 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 3. 给定一个二叉搜索树(BST),找到树中第 K 小的节点 4. LRU缓存机制 5. 关于epoll和select的区别,以下哪些说法是正确的 6. 从innodb的索引结构分析,为什么索引的 key 长度不能太长 7. MySQL的数据如何恢复到任意时间点? 8. NFS 和 SMB 是最常见的两种 NAS(Network Attached

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个