/*그냥 제 풀이 올려용 총총...*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
/* include는 그냥 제가 원래 다 써놓고 보는 스타일이라 크게 신경 안쓰고 필요한것만 쓰면될듯요 */
using namespace std;
int map[1001][1001];
int issearched[1001][1001];
int N, M;
int dx[] = { 0,0,-1,1 };
int dy[] = { -1,1,0,0 };
queue > q;
bool inrange(int a, int b) {
if ((a >= 0 && a < N) && (b >= 0 && b < M)) return true;
else return false;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(issearched, -1, sizeof(issearched));
memset(map, 0, sizeof(map));
cin >> M >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 1) {
q.push(make_pair(i, j));
issearched[i][j] = 0;
}
}
}
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (issearched[nx][ny] == -1 && map[nx][ny] == 0 && inrange(nx, ny) == 1) {
issearched[nx][ny] = issearched[x][y] + 1;
q.push(make_pair(nx, ny));
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << issearched[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
int result = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
result = max(result, issearched[i][j]);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 0 && issearched[i][j] == -1) {
result = -1;
}
}
}
cout << result;
}
/*맵은 그대로 받고 issearched는 bool형이 아닌 int형으로 받아서 토마토 위치가 있는 시작점은 0, 안했으면 -1로 받아서 탐색 시작(map이 0이고, issearched가 -1이고, inrange가 true인 곳에서. 카운트는 issearched[nx][ny] = issearched[x][y]+1 이 때 x,y는 시작점이니까 0일거고, 최대값 출력을 할건데, 아예 안익는 경우도 있을테니깐 map이 0이면서 issearched가 -1(토마토가 있는데 탐색 x)인 부분이 있으면 result는 -1이 되게끔 출력 */
cdt416z 4년 전
일단 나와있는 예제는 다 해봤지만.. 바로 틀렸습니다가 뜨는 걸로 보아
queue의 배열 크기 문제인가 싶었지만 배열을 키워도 소용이 없습니다
제발 살려주세요..