101.孤岛的总面积
基础题目 可以自己尝试做一做 。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;
public class Main {
private static int count = 0;
private static int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
public static void bfs(Vector<Vector<Integer>> grid, int x, int y) {
Queue<Pair> que = new LinkedList<>();
que.add(new Pair(x, y));
grid.set(x, y, 0);
count++;
while (!que.isEmpty()) {
Pair cur = que.poll();
int curx = cur.x;
int cury = cur.y;
for (int i = 0; i < 4; i++) {
int nextx = curx + dir[i][0];
int nexty = cury + dir[i][1];
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid.get(0).size()) continue;
if (grid.get(nextx).get(nexty) == 1) {
que.add(new Pair(nextx, nexty));
count++;
grid.set(nextx, nexty, 0);
}
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
Vector<Vector<Integer>> grid = new Vector<>(n);
for (int i = 0; i < n; i++) {
grid.add(new Vector<>(m));
for (int j = 0; j < m; j++) {
grid.get(i).add(scanner.nextInt());
}
}
for (int i = 0; i < n; i++) {
if (grid.get(i).get(0) == 1) bfs(grid, i, 0);
if (grid.get(i).get(m - 1) == 1) bfs(grid, i, m - 1);
}
for (int j = 0; j < m; j++) {
if (grid.get(0).get(j) == 1) bfs(grid, 0, j);
if (grid.get(n - 1).get(j) == 1) bfs(grid, n - 1, j);
}
count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid.get(i).get(j) == 1) bfs(grid, i, j);
}
}
System.out.println(count);
}
static class Pair {
int x;
int y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
}
102.沉没孤岛
和上一题差不多,尝试自己做做
import java.util.Scanner;
import java.util.Vector;
public class Main {
private static int[][] dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
public static void dfs(Vector<Vector<Integer>> grid, int x, int y) {
grid.set(x, y, 2);
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid.get(0).size()) continue;
if (grid.get(nextx).get(nexty) == 0 || grid.get(nextx).get(nexty) == 2) continue;
dfs(grid, nextx, nexty);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
Vector<Vector<Integer>> grid = new Vector<>(n);
for (int i = 0; i < n; i++) {
grid.add(new Vector<Integer>(m));
for (int j = 0; j < m; j++) {
grid.get(i).add(scanner.nextInt());
}
}
for (int i = 0; i < n; i++) {
if (grid.get(i).get(0) == 1) dfs(grid, i, 0);
if (grid.get(i).get(m - 1) == 1) dfs(grid, i, m - 1);
}
for (int j = 0; j < m; j++) {
if (grid.get(0).get(j) == 1) dfs(grid, 0, j);
if (grid.get(n - 1).get(j) == 1) dfs(grid, n - 1, j);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid.get(i).get(j) == 1) grid.get(i).set(j, 0);
if (grid.get(i).get(j) == 2) grid.get(i).set(j, 1);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(grid.get(i).get(j) + " ");
}
System.out.println();
}
}
}
103.水流问题
需要点优化思路,建议先自己读题,相处一个解题方法,有时间就自己写代码,没时间就直接看题解,优化方式 会让你 耳目一新。
import java.util.Scanner;
import java.util.Vector;
public class Main {
private static int n, m;
private static int[][] dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
public static void dfs(Vector<Vector<Integer>> grid, Vector<Vector<Boolean>> visited, int x, int y) {
if (visited.get(x).get(y)) return;
visited.set(x, y, true);
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
if (grid.get(x).get(y) < grid.get(nextx).get(nexty)) continue;
dfs(grid, visited, nextx, nexty);
}
}
public static boolean isResult(Vector<Vector<Integer>> grid, int x, int y) {
Vector<Vector<Boolean>> visited = new Vector<>(n, new Vector<>(m, false));
dfs(grid, visited, x, y);
boolean isFirst = false;
boolean isSecond = false;
for (int j = 0; j < m; j++) {
if (visited.get(0).get(j)) {
isFirst = true;
break;
}
}
for (int i = 0; i < n; i++) {
if (visited.get(i).get(0)) {
isFirst = true;
break;
}
}
for (int j = 0; j < m; j++) {
if (visited.get(n - 1).get(j)) {
isSecond = true;
break;
}
}
for (int i = 0; i < n; i++) {
if (visited.get(i).get(m - 1)) {
isSecond = true;
break;
}
}
return isFirst && isSecond;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
Vector<Vector<Integer>> grid = new Vector<>(n);
for (int i = 0; i < n; i++) {
grid.add(new Vector<Integer>(m));
for (int j = 0; j < m; j++) {
grid.get(i).add(scanner.nextInt());
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (isResult(grid, i, j)) {
System.out.println(i + " " + j);
}
}
}
}
}
104.建造最大岛屿
同样优化思路也会让你耳目一新,自己想比较难想出来。
import java.util.Scanner;
import java.util.Vector;
import java.util.HashMap;
import java.util.HashSet;
public class Main {
private static int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
private static int n, m;
private static int count;
public static void dfs(Vector<Vector<Integer>> grid, Vector<Vector<Boolean>> visited, int x, int y, int mark) {
if (visited.get(x).get(y) || grid.get(x).get(y) == 0) return;
visited.set(x, y, true);
grid.set(x, y, mark);
count++;
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
dfs(grid, visited, nextx, nexty, mark);
}
}
public static int largestIsland(int n, int m, Vector<Vector<Integer>> grid) {
Vector<Vector<Boolean>> visited = new Vector<>(n, new Vector<>(m, false));
HashMap<Integer, Integer> gridNum = new HashMap<>();
int mark = 2;
boolean isAllGrid = true;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid.get(i).get(j) == 0) isAllGrid = false;
if (!visited.get(i).get(j) && grid.get(i).get(j) == 1) {
count = 0;
dfs(grid, visited, i, j, mark);
gridNum.put(mark, count);
mark++;
}
}
}
if (isAllGrid) {
return n * m;
}
int result = 0;
HashSet<Integer> visitedGrid = new HashSet<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid.get(i).get(j) == 0) {
count = 1;
visitedGrid.clear();
for (int k = 0; k < 4; k++) {
int neari = i + dir[k][0];
int nearj = j + dir[k][1];
if (neari < 0 || neari >= n || nearj < 0 || nearj >= m) continue;
if (visitedGrid.contains(grid.get(neari).get(nearj))) continue;
count += gridNum.getOrDefault(grid.get(neari).get(nearj), 0);
visitedGrid.add(grid.get(neari).get(nearj));
}
}
result = Math.max(result, count);
}
}
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
Vector<Vector<Integer>> grid = new Vector<>(n);
for (int i = 0; i < n; i++) {
grid.add(new Vector<Integer>(m));
for (int j = 0; j < m; j++) {
grid.get(i).add(scanner.nextInt());
}
}
int largestArea = largestIsland(n, m, grid);
System.out.println(largestArea);
}
}