全球变暖java_第九届 蓝桥杯 JavaB组 全球变暖
標題:全球變暖
你有一張某海域NxN像素的照片,".“表示海洋、”#"表示陸地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由于全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的范圍會被海水淹沒。具體來說如果一塊陸地像素與海洋相鄰(上下左右四個相鄰像素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
…
…
…
…
…#…
…
…
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
【輸入格式】
第一行包含一個整數N。 (1 <= N <= 1000)
以下N行N列代表一張海域照片。
照片保證第1行、第1列、第N行、第N列的像素都是海洋。
【輸出格式】
一個整數表示答案。
【輸入樣例】
7
…
.##…
.##…
…##.
…####.
…###.
…
【輸出樣例】
1
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效代碼處理。
方法:
三步
第一步:用dfs找出總共的島嶼數目
第二步:用兩個for循環淹沒島嶼(注意理解題意,四面一面鄰海就要被淹沒,但是程序運行時一次淹沒一個島嶼,所以我們需要用一個vis數組來表示這個島嶼是被淹沒的島嶼還是從最開始就是海洋)
第三步:再用dfs找出淹沒后還有多少個島嶼,前后相減就是被淹沒的島嶼數
package 第九屆;
import java.util.Scanner;
public class _09全球變暖 {
static int n;
static int[][] dfs_vis;
static int dir[][] = {{1,0},{-1,0},{0,1},{0,-1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
dfs_vis = new int[n][n];
char[][] map = new char[n][n];
for(int i = 0; i < n; i++) {
String s = sc.nextLine();
map[i] = s.toCharArray();
}
//找島嶼
int start = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(map[i][j] == '#' && dfs_vis[i][j] == 0) {
dfs_vis[i][j] = 1;
dfs(i,j,map);
start++;
}
}
}
//淹沒
int vis[][] = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(map[i][j] == '#') {
vis[i][j] = 1;
for(int k = 0; k < 4; k++) {
int nx = i + dir[k][0];
int ny = j + dir[k][1];
if(check(nx,ny,n) && map[nx][ny] == '.' && vis[nx][ny] == 0) {
//vis[nx][ny] = 1;
map[i][j] = '.';
break;
}
}
}
}
}
//找淹沒后剩余的島嶼
dfs_vis = new int[n][n];
int end = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(map[i][j] == '#' && dfs_vis[i][j] == 0) {
dfs_vis[i][j] = 1;
dfs(i,j,map);
end++;
}
}
}
System.out.println(start);
System.out.println(end);
System.out.println(start-end);
}
private static void dfs(int i, int j, char[][] map) {
for(int k = 0; k < 4; k++) {
int nx = i + dir[k][0];
int ny = j + dir[k][1];
if(check(nx,ny,map.length) && map[nx][ny] == '#' && dfs_vis[nx][ny] == 0) {
dfs_vis[nx][ny] = 1;
dfs(nx,ny,map);
}
}
}
private static boolean check(int nx, int ny,int n) {
return nx>=0 && nx=0 && ny
}
}
標簽:nx,第九屆,JavaB,int,dfs,藍橋,vis,map,ny
來源: https://blog.csdn.net/Cypresszky/article/details/104882582
總結
以上是生活随笔為你收集整理的全球变暖java_第九届 蓝桥杯 JavaB组 全球变暖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中map可以为空吗_检查Navi
- 下一篇: 代码讲解java_主要代码的讲解