알고리즘 공부

백준 토마토

컴퓨터과학 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;
}