[백준 1926] 그림 문제 복습 (실수 최종 수정)
2023. 3. 31. 22:36ㆍ자료구조 및 알고리즘/백준
728x90
공백으로 숫자를 받아서 2차원 배열 board의 각 요소의 값을 정하는 방법
// board 입력 받는 방식1 - 모르는 부분 check
for(int i=0; i<n; i++)
for (int j = m; j < m; j++)
cin >> board[i][j];
그리고 pop한 만큼 area++ 해서 넓이를 늘려줘야 되는데,
for(int dir=0; dir<4; dir++)문안에서 push한 걸로 하면은 숫자 1이 모자란다. while(!Q.empty()) 윗 문장에 Q.push({i,j})가 있기 때문에
if (vis[i][j] == 0 && board[i][j] == 1) {
vis[i][j] = 1; // 시작점 표시
num++; // 그림 수 늘어나고
int area = 0; // 넓이는 0부터 시작하고
queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언
Q.push({ i,j });
while (!Q.empty()) {
pair<int, int> cur = Q.front(); Q.pop();
area++; // pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
for (int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (vis[nx][ny] || board[nx][ny] != 1) continue;
vis[nx][ny] = 1;
Q.push({ nx, ny });
}
}
mx = max(area, mx);
}
그래서 전체 코드는
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define X first
#define Y second
int board[502][502];
bool vis[502][502];
int n, m;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
// board 입력 받는 방식1 - 모르는 부분 check
for(int i=0; i<n; i++)
for (int j = m; j < m; j++)
cin >> board[i][j];
int num = 0; // 그림의 수
int mx = 0; // 그림의 최댓값
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vis[i][j] || board[i][j] == 0) continue;
num++; // 그림 수 늘어나고
queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언6
vis[i][j] = 1; // 시작점 표시
Q.push({ i,j });
int area = 0; // 넓이는 0부터 시작하고
while (!Q.empty()) {
area++;
pair<int, int> cur = Q.front(); Q.pop();
// pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
for (int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (vis[nx][ny] || board[nx][ny] != 1) continue;
vis[nx][ny] = 1;
Q.push({ nx, ny });
}
}
mx = max(area, mx);
}
}
cout<<num<<'\n'<<mx;
}
이 코드로 하니까 결과가 무조건 0 0 나오는데 어떡하지ㅠㅠㅠ
아래 코드는 main 코드 5줄 (ios부터 board 입력 받는 부분까지)만 바킹독님꺼 복붙했는데, 돌아가서 이상해ㅜㅜ
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define X first
#define Y second
int board[502][502];
bool vis[502][502];
int n, m;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> board[i][j];
int mx = 0; // 그림의 최댓값
int num = 0; // 그림의 수
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vis[i][j]==0 && board[i][j] == 1){
num++; // 그림 수 늘어나고
queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언6
vis[i][j] = 1; // 시작점 표시
Q.push({ i,j });
int area = 0; // 넓이는 0부터 시작하고
while (!Q.empty()) {
area++;
pair<int, int> cur = Q.front(); Q.pop();
// pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
for (int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (vis[nx][ny] || board[nx][ny] != 1) continue;
vis[nx][ny] = 1;
Q.push({nx, ny});
}
}
mx = max(area, mx);
}
}
}
cout<<num<<'\n'<<mx;
}
실수 이유는 - https://www.acmicpc.net/board/view/114670#comment-179759
20번째 줄 for문 잘못 설정함ㅋㅋㅋ
728x90
'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글
[백준 1085] 직사각형 탈출 (0) | 2023.04.01 |
---|---|
[백준 24444] 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.03.31 |
[백준 24480] 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.03.28 |
[백준 24479] 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.03.28 |
[백준 7569] 토마토 (3D 버전) (수정 진행 중) (0) | 2023.03.27 |