BOJ : 7576 토마토 (C++)
문제
Code
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
int board[1002][1002];
int dist[1002][1002];
#define X first
#define Y second
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int N, M, max_day;
bool check(){
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
{
if(board[i][j] == 0) return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
queue<pair<int,int>> Q;
cin >> M >> N; // M:열(y) / N:행(x)
for(int i=0;i<N;i++)
{
fill(dist[i], dist[i]+M, -1);
for(int j=0;j<M;j++)
{
cin >> board[i][j];
if(board[i][j] == 1)
{
Q.push({i,j});
dist[i][j] = 0;
}
}
}
while(!Q.empty())
{
auto cur = Q.front(); Q.pop();
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(board[nx][ny] != 0 || dist[nx][ny] != -1) continue;
dist[nx][ny] = dist[cur.X][cur.Y]+1;
Q.push({nx,ny});
max_day = max(max_day,dist[nx][ny]);
board[nx][ny] = 1;
}
}
if(check())
cout << max_day;
else
cout << -1;
}
- 정점 여러개에서 같이 BFS 시작하기 위해
--> board[i][j]가 1일 때 바로 Q.push({i,j});
동시에 dist[i][j]도 0으로 만들어준다.
- max 함수 이용해서 크기비교
max_day = max(max_day,dist[nx][ny]);
- 시간초과 나기 쉬운문제라서 유의해야함
- 1년전 코드보다 똑똑해진걸보니 멍청해지지는 않은듯;
Author And Source
이 문제에 관하여(BOJ : 7576 토마토 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@neity16/BOJ-7576-토마토-C
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <iostream> #include <queue> #include <utility> using namespace std; int board[1002][1002]; int dist[1002][1002]; #define X first #define Y second int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int N, M, max_day; bool check(){ for(int i=0;i<N;i++) for(int j=0;j<M;j++) { if(board[i][j] == 0) return false; } return true; } int main() { ios::sync_with_stdio(0); cin.tie(0); queue<pair<int,int>> Q; cin >> M >> N; // M:열(y) / N:행(x) for(int i=0;i<N;i++) { fill(dist[i], dist[i]+M, -1); for(int j=0;j<M;j++) { cin >> board[i][j]; if(board[i][j] == 1) { Q.push({i,j}); dist[i][j] = 0; } } } while(!Q.empty()) { auto cur = Q.front(); Q.pop(); 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(board[nx][ny] != 0 || dist[nx][ny] != -1) continue; dist[nx][ny] = dist[cur.X][cur.Y]+1; Q.push({nx,ny}); max_day = max(max_day,dist[nx][ny]); board[nx][ny] = 1; } } if(check()) cout << max_day; else cout << -1; }
- 정점 여러개에서 같이 BFS 시작하기 위해
--> board[i][j]가 1일 때 바로 Q.push({i,j});
동시에 dist[i][j]도 0으로 만들어준다.- max 함수 이용해서 크기비교
max_day = max(max_day,dist[nx][ny]);
- 시간초과 나기 쉬운문제라서 유의해야함
- 1년전 코드보다 똑똑해진걸보니 멍청해지지는 않은듯;
Author And Source
이 문제에 관하여(BOJ : 7576 토마토 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@neity16/BOJ-7576-토마토-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)