[알고리즘] 4 - 섬의 수
15425 단어 algorithms
1. 개요
2. 투쟁
3. 코드
주요 기능
int numIslands(vector<vector<char>>& grid) {
if(grid.size() == 0) return 0;
int count = 0;
for (int i = 0; i < grid.size(); i++){
for (int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == '0') {
continue;
} else {
BFS(grid, i, j, count);
}
}
}
return count;
}
잘못된 BFS 기능
void BFS(vector<vector<char>>& grid, int i, int j, int& count){
vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
queue<vector<int>> q;
vector<int> start = {i, j};
q.push(start);
while(!q.empty()){
vector<int> curr = q.front();
grid[curr[0]][curr[1]] = '0';
q.pop();
for (auto v:dir){
int newCol = curr[0] + v[0];
int newRow = curr[1] + v[1];
if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
continue;
} else {
vector<int> nextPos = {newCol, newRow};
q.push(nextPos);
}
}
}
count++;
}
올바른 BFS 기능
static void BFS(vector<vector<char>>& grid, int i, int j, int& count){
vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
queue<vector<int>> q;
vector<int> start = {i, j};
q.push(start);
while(!q.empty()){
vector<int> curr = q.front();
q.pop();
grid[curr[0]][curr[1]] = '0';
for (auto v:dir){
int newCol = curr[0] + v[0];
int newRow = curr[1] + v[1];
if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
continue;
} else {
vector<int> nextPos = {newCol, newRow};
grid[curr[0]][curr[1]] = '0'; // <= Solution
q.push(nextPos);
}
}
}
count++;
}
4. 설명
첫 번째 함수가 오류를 일으키는 이유를 보셨습니까? 그 이유는 내가 BFS를 활용하지 않았기 때문입니다. 위, 아래, 왼쪽, 오른쪽 좌표를 스캔하는 동안 '1'을 '0'으로 바꾸지 않았기 때문에 다음 루프에서 큐는 내가 이미 방문한 좌표를 계속 푸시할 것입니다. 답변이 동일하더라도 시간 제한 초과 오류입니다.
Reference
이 문제에 관하여([알고리즘] 4 - 섬의 수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/_ben/algorithms-4-number-of-islands-2ahd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
int numIslands(vector<vector<char>>& grid) {
if(grid.size() == 0) return 0;
int count = 0;
for (int i = 0; i < grid.size(); i++){
for (int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == '0') {
continue;
} else {
BFS(grid, i, j, count);
}
}
}
return count;
}
void BFS(vector<vector<char>>& grid, int i, int j, int& count){
vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
queue<vector<int>> q;
vector<int> start = {i, j};
q.push(start);
while(!q.empty()){
vector<int> curr = q.front();
grid[curr[0]][curr[1]] = '0';
q.pop();
for (auto v:dir){
int newCol = curr[0] + v[0];
int newRow = curr[1] + v[1];
if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
continue;
} else {
vector<int> nextPos = {newCol, newRow};
q.push(nextPos);
}
}
}
count++;
}
static void BFS(vector<vector<char>>& grid, int i, int j, int& count){
vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
queue<vector<int>> q;
vector<int> start = {i, j};
q.push(start);
while(!q.empty()){
vector<int> curr = q.front();
q.pop();
grid[curr[0]][curr[1]] = '0';
for (auto v:dir){
int newCol = curr[0] + v[0];
int newRow = curr[1] + v[1];
if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
continue;
} else {
vector<int> nextPos = {newCol, newRow};
grid[curr[0]][curr[1]] = '0'; // <= Solution
q.push(nextPos);
}
}
}
count++;
}
첫 번째 함수가 오류를 일으키는 이유를 보셨습니까? 그 이유는 내가 BFS를 활용하지 않았기 때문입니다. 위, 아래, 왼쪽, 오른쪽 좌표를 스캔하는 동안 '1'을 '0'으로 바꾸지 않았기 때문에 다음 루프에서 큐는 내가 이미 방문한 좌표를 계속 푸시할 것입니다. 답변이 동일하더라도 시간 제한 초과 오류입니다.
Reference
이 문제에 관하여([알고리즘] 4 - 섬의 수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_ben/algorithms-4-number-of-islands-2ahd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)