Number of Islands

本文讨论了如何优化解决二维网格地图中岛屿数量计算的问题。通过改变地图状态并在队列中添加岛屿前先进行修改,避免了重复计算,提高了算法效率。详细介绍了改进后的算法步骤,并附带了实例分析。

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer: 3

 

 

 1 public class Solution {
 2     class Node{
 3         int x;
 4         int y;
 5         public Node(int x, int y){
 6             this.x = x;
 7             this.y = y;
 8         }
 9     }
10     public int numIslands(char[][] grid) {
11         if(grid == null || grid.length == 0 || grid[0].length == 0) return 0;
12         int result = 0;
13         for(int i = 0; i < grid.length; i ++){
14             for(int j = 0; j < grid[0].length; j ++){
15                 if(grid[i][j] == '1'){
16                     result ++;
17                     //set this island to be water ('1' to '0')
18                     LinkedList<Node> queue = new LinkedList<Node>();
19                     queue.add(new Node(i, j));
20                     while(!queue.isEmpty()){
21                         Node tmp = queue.poll();
22                         grid[tmp.x][tmp.y] = '0';
23                         if(tmp.x > 0 && grid[tmp.x - 1][tmp.y] == '1') queue.add(new Node(tmp.x - 1, tmp.y));
24                         if(tmp.x < grid.length - 1 && grid[tmp.x + 1][tmp.y] == '1') queue.add(new Node(tmp.x + 1, tmp.y));
25                         if(tmp.y > 0 && grid[tmp.x][tmp.y - 1] == '1') queue.add(new Node(tmp.x, tmp.y - 1));
26                         if(tmp.y < grid[0].length - 1 && grid[tmp.x][tmp.y + 1] == '1') queue.add(new Node(tmp.x, tmp.y + 1));
27                     }
28                 }
29             }
30         }
31         return result;
32     }
33 }

Submission Result: Time Limit ExceededMore Details

Last executed input:
"11111011111111101011",
"01111111111110111110",
"10111001101111111111",
"11110111111111111111",
"10011111111111111111",
"10111111011101110111",
"01111111111101101111",
"11111111111101111011",
"11111111110111111111",
"11111111111111111111",
"01111111011111111111",
"11111111111111111111",
"11111111111111111111",
"11111011111110111111",
"10111110111011110111",
"11111111111101111110",
"11111111111110111100",
"11111111111111111111",
"11111111111111111111",
"11111111111111111111".

 原因是很多点被重复放到了queue中。Because when a Point is added, the state of this Point should be changed. In your code, one Point may be add in the LinkedList more than once.

So next solution:

modify grid[i][j] firstly (before put into the queue).

 1 public class Solution {
 2     class Node{
 3         int x;
 4         int y;
 5         public Node(int x, int y){
 6             this.x = x;
 7             this.y = y;
 8         }
 9     }
10     public int numIslands(char[][] grid) {
11         if(grid == null || grid.length == 0 || grid[0].length == 0) return 0;
12         int result = 0;
13         for(int i = 0; i < grid.length; i ++){
14             for(int j = 0; j < grid[0].length; j ++){
15                 if(grid[i][j] == '1'){
16                     result ++;
17                     //set this island to be water ('1' to '0')
18                     LinkedList<Node> queue = new LinkedList<Node>();
19                     queue.add(new Node(i, j));
20                     grid[i][j] = '0';
21                     while(!queue.isEmpty()){
22                         Node tmp = queue.poll();
23                         if(tmp.x > 0 && grid[tmp.x - 1][tmp.y] == '1'){
24                             grid[tmp.x - 1][tmp.y] = '0';
25                             queue.add(new Node(tmp.x - 1, tmp.y));  
26                         } 
27                         if(tmp.x < grid.length - 1 && grid[tmp.x + 1][tmp.y] == '1'){
28                             grid[tmp.x + 1][tmp.y] = '0';
29                             queue.add(new Node(tmp.x + 1, tmp.y));
30                         } 
31                         if(tmp.y > 0 && grid[tmp.x][tmp.y - 1] == '1'){
32                             grid[tmp.x][tmp.y - 1] = '0';
33                             queue.add(new Node(tmp.x, tmp.y - 1));
34                         } 
35                         if(tmp.y < grid[0].length - 1 && grid[tmp.x][tmp.y + 1] == '1'){
36                             grid[tmp.x][tmp.y + 1] = '0';
37                             queue.add(new Node(tmp.x, tmp.y + 1));
38                         } 
39                     }
40                 }
41             }
42         }
43         return result;
44     }
45 }

 

转载于:https://www.cnblogs.com/reynold-lei/p/4465344.html

1328:Radar Installation 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d. We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates. Figure A Sample Input of Radar Installations 输入 The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases. The input is terminated by a line containing pair of zeros 输出 For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case. 生成c语言代码
10-20
以下是用于解决雷达安装问题的 C 语言代码: ```c #include <stdio.h> #include <math.h> #include <stdlib.h> // 定义一个结构体来存储每个岛屿对应的雷达可安装区间 typedef struct { double left; double right; } Interval; // 比较函数,用于 qsort 对区间按左端点排序 int compare(const void *a, const void *b) { Interval *ia = (Interval *)a; Interval *ib = (Interval *)b; if (ia->left < ib->left) return -1; if (ia->left > ib->left) return 1; return 0; } int main() { int n, d; int case_num = 1; while (1) { scanf("%d %d", &n, &d); if (n == 0 && d == 0) break; Interval intervals[1000]; int impossible = 0; // 读取每个岛屿的坐标,并计算对应的雷达可安装区间 for (int i = 0; i < n; i++) { int x, y; scanf("%d %d", &x, &y); if (y > d) { impossible = 1; } double dx = sqrt(d * d - y * y); intervals[i].left = x - dx; intervals[i].right = x + dx; } if (impossible) { printf("Case %d: -1\n", case_num); } else { // 对区间按左端点进行排序 qsort(intervals, n, sizeof(Interval), compare); int radar_count = 1; double current_right = intervals[0].right; // 遍历排序后的区间,计算最少雷达数量 for (int i = 1; i < n; i++) { if (intervals[i].left > current_right) { radar_count++; current_right = intervals[i].right; } else if (intervals[i].right < current_right) { current_right = intervals[i].right; } } printf("Case %d: %d\n", case_num, radar_count); } case_num++; // 读取分隔用的空白行 while (getchar() != '\n'); } return 0; } ``` ### 代码解释 1. **结构体 `Interval`**:用于存储每个岛屿对应的雷达可安装区间,包含左端点 `left` 和右端点 `right`。 2. **`compare` 函数**:用于 `qsort` 对区间按左端点进行排序。 3. **主函数 `main`**: - 循环读取输入,直到遇到 `n = 0` 和 `d = 0` 时结束。 - 对于每个测试用例,读取每个岛屿的坐标,计算对应的雷达可安装区间。如果岛屿的 `y` 坐标大于雷达覆盖距离 `d`,则无法覆盖该岛屿,标记为 `impossible`。 - 如果没有无法覆盖的岛屿,对区间按左端点进行排序。 - 遍历排序后的区间,通过贪心算法计算最少雷达数量。 - 输出每个测试用例的编号和最少雷达数量,如果无法覆盖所有岛屿,则输出 `-1`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值