Algorithm/Cases-Study
SWEA-1949 등산로 조성
Xi_kor
2021. 3. 12. 22:08
DFS로 해결했다. 일단 한번 n*n씩 탐색을 하면서 등산로의 봉우리값을 찾았고 다시 탐색을 하면서 봉우리값과 같으면 벡터에 push해주었다.
입력받은 칸을 복사한 뒤에 해당 벡터의 봉우리에 해당하지 않는다면 1부터 깊이만큼 빼가면서 탐색을 하였고 그 길이를 ans라는 변수에 저장하게 해서 결국 ans에는 최댓값이 저장되도록 하였다.
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int dx[]={1, 0, -1, 0};
int dy[]={0, 1, 0, -1};
vector <pair<int, int> > v;
int ans, n, deep, maximum;
int map[8][8];
bool visit[8][8];
void dfs(int x, int y, int l, int arr[8][8]){
if(ans<l) ans=l;
visit[x][y]=true;
for(int i=0; i<4; i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&ny>=0&&nx<n&&ny<n){
if(visit[nx][ny]==false&&arr[nx][ny]<arr[x][y]){
dfs(nx, ny, l+1, arr);
}
}
}
visit[x][y]=false;
}
int main(){
int T;
cin>>T;
for(int test_case=1; test_case<=T; test_case++){
ans=0;
maximum=0;
memset(visit, false, sizeof(visit));
memset(map, 0, sizeof(map));
v.clear();
cin>>n>>deep;
int status=0;
int num;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin>>map[i][j];
if(i==0&&j==0) num=map[i][j];
else if(status==0){
if(num!=map[i][j]) status=1;
}
if(map[i][j]>maximum) maximum=map[i][j];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(map[i][j]==maximum) v.push_back(make_pair(i, j));
}
}
if(status==0) ans=2;
else{
for(int k=0; k<v.size(); k++){
int x=v[k].first;
int y=v[k].second;
int amap[8][8];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++) amap[i][j]=map[i][j];
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==x&&j==y) continue;
for(int t=1; t<=deep; t++){
amap[i][j]=amap[i][j]-t;
dfs(x, y, 1, amap);
amap[i][j]=amap[i][j]+t;
}
}
}
}
}
cout<<"#"<<test_case<<" "<<ans<<'\n';
}
return 0;
}