알고리즘 공부
백준 토마토
컴퓨터과학
2023. 8. 4. 19:34
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
이전 토마토 비슷한문제 쉽네여
#include <iostream>
#include <vector>
#include <queue>
#include<string>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#include<map>
#include<stack>
using namespace std;
struct Point {
int i, j,k, cnt, power;
char c;
};
void Prints(vector<vector<int>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<bool>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<char>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j];
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<vector<char>>>maps, int n, int m, int k) {
for (int t = 0; t < k; t++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[t][i][j];
}
cout << endl;
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<vector<int>>>maps, int n, int m, int k) {
for (int t = 0; t < k; t++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[t][i][j];
}
cout << endl;
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<vector<bool>>>maps, int n, int m, int k) {
for (int t = 0; t < k; t++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[t][i][j];
}
cout << endl;
}
cout << endl;
}
cout << endl;
}
void Prints(vector<int>line, int n) {
for (int i = 0; i < n; i++) {
cout << line[i] << ",";
}
cout << endl;
}
void Prints(string str, int n) {
for (int i = 0; i < n; i++) {
cout << str[i] << ",";
}
cout << endl;
}
bool checkmaps(vector<vector<int>>maps, vector<vector<int>>anw, int n, int m) {
bool bCheck = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maps[i][j] != anw[i][j]) {
bCheck = true;
i = n + 1;
j = m + 1;
continue;
}
}
}
return bCheck;
}
bool findstart(vector<vector<vector<bool>>>maps, int h, int n, int m) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
if (maps[i][j][k]==false) {
return false;
}
}
}
}
return true;
}
bool findstart(vector<vector<int>>maps, vector<vector<int>>anw, int n, int m, int) {
bool bCheck = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maps[i][j] != anw[i][j]) {
bCheck = true;
i = n + 1;
j = m + 1;
continue;
}
}
}
return bCheck;
}
struct Data {
int level;
string nickname;
};
struct Room {
int cnt;
int roomLevel;
string status;
vector<Data>players;
};
bool cmp(const Data &a,const Data &b) {
return a.nickname < b.nickname;
}
int main() {
int m, n, h;
cin >> m >> n >> h;
vector<vector<vector<int>>>maps;
vector<bool>tmpbVisited1(m,false);
vector<vector<bool>>tmpbVisited2(n,tmpbVisited1);
vector<vector<vector<bool>>>bVisited(h,tmpbVisited2);
for (int i = 0; i < h; i++) {
vector<vector<int>> tmpMaps2;
for (int j = 0; j < n; j++) {
vector<int> tmpMaps1;
for (int k = 0; k < m; k++) {
int tmp;
cin >> tmp;
if (tmp==-1) {
bVisited[i][j][k] = true;
}
tmpMaps1.push_back(tmp);
}
tmpMaps2.push_back(tmpMaps1);
}
maps.push_back(tmpMaps2);
}
int diri[] = { 1,-1,0,0,0,0 };
int dirj[] = { 0,0,1,-1,0,0 };
int dirk[] = { 0,0,0,0,1,-1 };
int days = 0;
queue<Point>q;
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
if (maps[i][j][k] == 1 && bVisited[i][j][k] == false) {
Point p;
p.i = i;
p.j = j;
p.k = k;
p.cnt = 0;
bVisited[i][j][k] = true;
q.push(p);
}
}
}
}
while (!q.empty()) {
Point start = q.front();
if (days <= start.cnt) {
days = start.cnt;
}
q.pop();
for (int t = 0; t < 6; t++) {
int tmpdiri = start.i + diri[t];
int tmpdirj = start.j + dirj[t];
int tmpdirk = start.k + dirk[t];
if (tmpdiri == -1 || tmpdirj == -1 || tmpdirk == -1 || tmpdiri >= h || tmpdirj >= n || tmpdirk >= m) {
continue;
}
if (bVisited[tmpdiri][tmpdirj][tmpdirk] == true || maps[tmpdiri][tmpdirj][tmpdirk] == -1 || maps[tmpdiri][tmpdirj][tmpdirk] == 1) {//-1 이나 이미 지난 1
continue;
}
Point tmpp;
tmpp.i = tmpdiri;
tmpp.j = tmpdirj;
tmpp.k = tmpdirk;
tmpp.cnt = start.cnt + 1;
q.push(tmpp);
bVisited[tmpdiri][tmpdirj][tmpdirk] = true;
}
}
bool bCheck = false;
if (bVisited.size() > 0) {
bCheck = findstart(bVisited, h, n, m);
}
if (bCheck == false) {
cout << -1;
}
else {
cout << days;
}
return 0;
}