000000
001110
000000 일때, (0,0)부터 탐색하면서, 1이면 탐색중지하면(return) 치즈 자동 구현됨.
* 의사코드
1. dfs(0,0)
2.if(1) -> v.push, return //1이면 삭제후보에넣고, 탐색종료
- 무한루프
dfs(0,0)
3.모두0 -> 프린트(시간, 직전v의크기), 루프탈출
4.아님->삭제후보들=0, 무한루프
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int n,m,t,ret,a[104][104],v[104][140];
vector<pair<int, int>> vv;
int dy[] = {1,0,-1,0};
int dx[] = {0,1,0,-1};
void dfs(int y, int x)
{
v[y][x] = 1; //방문처리를 먼저하라.
if (a[y][x]) { vv.push_back({ y,x }); return; }
for (int i = 0; i < 4; ++i)
{
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= m || v[ny][nx]) continue;
dfs(ny, nx);
}
return;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> a[i][j];
}
}
while (true)
{
t++;
vv.clear();
fill(&v[0][0], &v[0][0] + 104 * 104, 0);
dfs(0, 0);
for(pair<int,int> p : vv)
{
a[p.first][p.second] = 0;
}
////디버깅
//for (int i = 0; i < n; ++i)
//{
// for (int j = 0; j < m; ++j)
// {
// cout<< a[i][j]<<" ";
// }
// cout << endl;
//}
//cout << endl;
bool fin = true;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (a[i][j] != 0) { fin = false; break; }
}
}
if (fin) { cout << t << "\n" << vv.size(); break; }
}
return 0;
}
'Algorithm > boj' 카테고리의 다른 글
백준 17298 // 짝짓기는 stack(push[idx]) / 막대그림을그려라 (0) | 2023.05.23 |
---|---|
백준 1068 // 2차원벡터선언법 / 트리문제는 root 1개만 남는상황 예외처리하라 / 리프노드 카운팅은 int dfs (0) | 2023.05.23 |
백준 14502 // 3중반복문 ijk=>조합구현, a조작할필요없음(!v만으로 안전지역) (1) | 2023.05.19 |
백준 4949 // 공백포함 한줄입력은 getline(cin,str), 괄호체크 algoritm (0) | 2023.05.17 |
백준 9012 //괄호검사는 stack (0) | 2023.05.17 |