Language Grammar/C++
2024 - 10- 31 C++ 코딩테스트 10주완성 D+55
Jang_^
2024. 10. 31. 16:34
복습
복습을 습관화안해서 그런지 밀린 숙제들이 많다..!!
그리고 오랜만에 보니.. 로직은 기억나는데, 코드가 기억나질않는다 아무래도 내꺼가 될려면 복습은 필수인 것 같다!!
복습한 내용을 살펴보자
백준 2234 문제 - 성곽
오늘은 시간이 별로 많지않아서.. 하나밖에 못하였다.
실습코드
#include <bits/stdc++.h>
using namespace std;
int a[54][54],visited[54][54],N,M,cnt = 1,ret = -987654321;
int dy[4] = {0,-1,0,1},dx[4] = {-1,0,1,0};
vector<int> v;
int go(int y,int x)
{
int ret = 1;
visited[y][x] = cnt;
for(int i =0; i < 4; i++)
{
if(!(a[y][x] & (1 << i)))
{
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || ny >= N || nx < 0 || nx >= M || visited[ny][nx]) continue;
ret += go(ny,nx);
}
}
return ret;
}
int main()
{
cin >> M >> N;
for(int i =0; i < N; i++)
{
for(int j=0; j < M; j++)
{
cin >> a[i][j];
}
}
for(int i =0; i < N; i++)
{
for(int j =0; j < M; j++)
{
if(!visited[i][j])
{
v.push_back(go(i,j));
cnt++;
}
}
}
for(int i=0; i < N; i++)
{
for(int j =0; j < M; j++)
{
if(i < N-1 && (visited[i][j] != visited[i+1][j])) ret = max(ret,v[visited[i][j]-1] + v[visited[i+1][j]-1]);
if(j < M-1 && (visited[i][j] != visited[i][j+1])) ret = max(ret,v[visited[i][j] -1] + v[visited[i][j+1] -1]);
}
}
if(ret == -987654321) return 0;
else
{
sort(v.begin(),v.end());
cout << v.size() << endl <<v.back() << endl << ret;
}
}