Skip to content

Commit 190c699

Browse files
committed
Add C++ solutions for leetcode 1162.
1 parent 5842da2 commit 190c699

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include<vector>
2+
#include<queue>
3+
#include<algorithm>
4+
#include<iostream>
5+
using namespace std;
6+
7+
class Solution {
8+
const int dx[4] = {0, 1, 0, -1};
9+
const int dy[4] = {1, 0, -1, 0};
10+
public:
11+
int maxDistance(vector<vector<int>>& grid) {
12+
int N = grid.size();
13+
queue<pair<int, int>> q; // queue存储坐标值, 即 pair of {x, y}
14+
vector<vector<int>> d(N, vector<int>(N, 1000)); // 二维数组d[][]: 记录每个格子grid[i][j]的距离值
15+
for (int i = 0; i < N; i++)
16+
{
17+
for (int j = 0; j < N; j++)
18+
if (grid[i][j] == 1)
19+
{
20+
q.push(make_pair(i, j));
21+
d[i][j] = 0;
22+
}
23+
}
24+
while (!q.empty())
25+
{
26+
auto kvp = q.front();
27+
q.pop();
28+
for (int i = 0; i < 4; i++)
29+
{
30+
int newX = kvp.first + dx[i], newY = kvp.second + dy[i];
31+
if (newX < 0 || newX >= N || newY < 0 || newY >= N) // 越界了, 跳过
32+
continue;
33+
34+
if (d[newX][newY] > d[kvp.first][kvp.second] + 1) /* 如果从水域(值为0的格子)走到陆地(值为1的格子)或从陆地走到水域, 且新到达的位置之前没被访问过, 此时需要将其坐标加入队列, 并更新距离值d */
35+
{
36+
d[newX][newY] = d[kvp.first][kvp.second] + 1; /* 当前格子的上下左右4个方向之一走一步恰好使得曼哈顿距离增加1 */
37+
q.push(make_pair(newX, newY));
38+
}
39+
}
40+
}
41+
int res = -1;
42+
for (int i = 0; i < N; i++)
43+
{
44+
for (int j = 0; j < N; j++)
45+
{
46+
if (grid[i][j] == 0 && d[i][j] <= 200) /* 挑出访问过的水域位置(值为0的格子), 并维护这些格子中距离值d的最大值 */
47+
res = max(res, d[i][j]);
48+
}
49+
}
50+
return res;
51+
}
52+
};
53+
54+
// Test
55+
int main()
56+
{
57+
Solution sol;
58+
vector<vector<int>> grid =
59+
{
60+
{1, 0, 1},
61+
{0, 0, 0},
62+
{1, 0, 1}
63+
};
64+
auto res = sol.maxDistance(grid);
65+
cout << res << endl;
66+
67+
return 0;
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include<vector>
2+
#include<queue>
3+
#include<algorithm>
4+
#include<iostream>
5+
using namespace std;
6+
7+
class Solution {
8+
const int dx[4] = {0, 1, 0, -1};
9+
const int dy[4] = {1, 0, -1, 0};
10+
public:
11+
int maxDistance(vector<vector<int>>& grid) {
12+
const int N = grid.size();
13+
deque<pair<int, int>> q;
14+
int d[N][N];
15+
for (auto& row : d)
16+
fill(row, row + N, 1000);
17+
for (int i = 0; i < N; i++)
18+
{
19+
for (int j = 0; j < N; j++)
20+
if (grid[i][j] == 1)
21+
{
22+
q.push_back(make_pair(i, j));
23+
d[i][j] = 0;
24+
}
25+
}
26+
while (!q.empty())
27+
{
28+
auto kvp = q.front();
29+
q.pop_front();
30+
for (int i = 0; i < 4; i++)
31+
{
32+
int newX = kvp.first + dx[i], newY = kvp.second + dy[i];
33+
if (newX < 0 || newX >= N || newY < 0 || newY >= N)
34+
continue;
35+
36+
if (d[newX][newY] > d[kvp.first][kvp.second] + 1)
37+
{
38+
d[newX][newY] = d[kvp.first][kvp.second] + 1;
39+
q.push_back(make_pair(newX, newY));
40+
}
41+
}
42+
}
43+
int res = -1;
44+
for (int i = 0; i < N; i++)
45+
{
46+
for (int j = 0; j < N; j++)
47+
{
48+
if (grid[i][j] == 0 && d[i][j] <= 200)
49+
res = max(res, d[i][j]);
50+
}
51+
}
52+
return res;
53+
}
54+
};
55+
56+
// Test
57+
int main()
58+
{
59+
Solution sol;
60+
vector<vector<int>> grid =
61+
{
62+
{1, 0, 1},
63+
{0, 0, 0},
64+
{1, 0, 1}
65+
};
66+
auto res = sol.maxDistance(grid);
67+
cout << res << endl;
68+
69+
return 0;
70+
}

0 commit comments

Comments
 (0)