본문으로 바로가기

출처 : swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

고려사항

  • 체크해줘야하고 다음 단계로 넘겨야할 인자들이 몇 개 있어서, bfs 보단 dfs 가 용이한 것 같다.
  • 모든 방문하는 모든 지점에서, k만큼 높이를 낮췄는지에 대해서 useK 를 통해 관리하고,
    이전에 k만큼 낮췄다면, 이후 부터는 24 - 30 라인만 진행, 다음 방문할 지점이 현재 높이보다 낮은지만 비교,
    아직 k만큼 안 낮췄다면, 안 낮고 진행 가능 여부 판별 ( 30 - 35 라인 ),
    1 ~ k 까지 다음 지점을 낮춰가며 dfs 진행 ( 37 - 43 라인 )
  • 코드를 조금 더 깔끔하게 할 수 있을 것 같다. ( 24 - 35 가 중복이다 )

 

#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int dy[4] = {-1, 1, 0 , 0};
int dx[4] = {0, 0, 1, -1};
int mount[8][8];
bool visit[8][8];
int t, n, k, ans;
void dfs(int y, int x, bool useK, int curHeight, int curLength){
if(ans < curLength){
ans = curLength;
}
int nextY, nextX;
for(int i=0;i<4;++i){
nextY = y + dy[i];
nextX = x + dx[i];
if(nextY>=0 && nextY<n && nextX>=0 && nextX<n && !visit[nextY][nextX]){
if(useK){
if(mount[nextY][nextX] < curHeight){
visit[nextY][nextX] = true;
dfs(nextY, nextX, true, mount[nextY][nextX], curLength+1);
visit[nextY][nextX] = false;
}
}else{
if(mount[nextY][nextX] < curHeight){
visit[nextY][nextX] = true;
dfs(nextY, nextX, false, mount[nextY][nextX], curLength+1);
visit[nextY][nextX] = false;
}
for(int j=1;j<=k;++j){
if(mount[nextY][nextX]-j < curHeight){
visit[nextY][nextX] = true;
dfs(nextY, nextX, true, mount[nextY][nextX]-j, curLength+1);
visit[nextY][nextX] = false;
}
}
}
}
}
}
int main() {
cin>>t;
for(int i=1;i<=t;++i){
ans = 1;
int maxHeight = -1;
memset(visit, 0, 64);
cin>>n>>k;
for(int p=0;p<n;++p){
for(int q=0;q<n;++q){
cin>>mount[p][q];
maxHeight = max(maxHeight, mount[p][q]);
}
}
for(int p=0;p<n;++p){
for(int q=0;q<n;++q){
if(mount[p][q] == maxHeight){
visit[p][q] = true;
dfs(p, q, false, mount[p][q], 1);
visit[p][q] = false;
for(int j=1;j<=k;++j){
//memset(visit, -1, 64);
visit[p][q] = true;
dfs(p, q, true, mount[p][q]-j, 1);
visit[p][q] = false;
}
}
}
}
cout<<"#"<<i<<" "<<ans<<"\n";
}
return 0;
}

 

SW EA 삼성 아카데미카테고리의 다른글

05648 - 원자 소멸 시물레이션  (0) 2019.12.31