在给定的二维二进制数组 A
中,存在两座岛。(岛是由四面相连的 1
形成的一个最大组。)
现在,我们可以将 0
变为 1
,以使两座岛连接起来,变成一座岛。
返回必须翻转的 0
的最小数目。(可以保证答案至少是 1
。)
class Solution { private: struct node { int x, y; int l; }; int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; queue<node> que; void dfs_join(vector<vector<int>>& grid, int x, int y) { grid[x][y] = 2; que.push((node){x, y, 0}); for(int i = 0; i < 4; i++) { int tx = x + dir[i][0], ty = y + dir[i][1]; if(tx < 0 || tx >= grid.size() || ty < 0 || ty >= grid[0].size() || !grid[tx][ty] || grid[tx][ty] == 2) continue; dfs_join(grid, tx, ty); } } void find_start(vector<vector<int>>& grid) { for(int i = 0; i < grid.size(); i++) { for(int j = 0; j < grid[0].size(); j++) { if(grid[i][j]) { dfs_join(grid, i, j); return; } } } } public: int shortestBridge(vector<vector<int>>& grid) { int i, j; find_start(grid); while(!que.empty()) { int x = que.front().x, y = que.front().y; for(int i = 0; i < 4; i++) { int tx = x + dir[i][0], ty = y + dir[i][1]; if(tx < 0 || tx >= grid.size() || ty < 0 || ty >= grid[0].size() || grid[tx][ty] == 2) continue; if(grid[tx][ty]) return que.front().l; grid[tx][ty] = 2; que.push((node){tx, ty, que.front().l + 1}); } que.pop(); } return 0; } };