问题描述:
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 }
效果演示:
因时间问题,未细究其时间优化问题,代码有点粗糙,勿怪。