336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
재귀함수로 구현하는 문제...
범위만 잘 정해주면 풀기 쉬운 문제였다.
근데 내 코드는 인자가 내가 많이 넣은건가.. 그래서 약간.. 변수 넣을 때 굉장히 헷갈렸다.
dfs( 블록의 시작 행, 시작 열, 끝 행, 끝 열, 축적값 , filter사이즈)
순으로 탐색을 한다.
그리고 시작행, 끝행 사이에 입력된 row 가 존재, 시작열, 끝열 사이에 col 이 존재 하지 않을 경우에는 함수를 종료시킨다.
아닌 경우 탐색을 계속 한다.
결과로 시작행과 끝행이 입력된 row와 col과 같아지면 축적된 값을 내놓는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include<cstdio> int dir_r[] = {1,1,2,2}; int dir_c[] = {1,2,1,2}; int n, row, col; int pow2(int a, int b){ int ret = 1; for(int i = 0 ; i < b ; i++) ret *= a; return ret; } int max2(int a, int b){ return a>b? a:b; } int dfs(int sr, int sc, int dr, int dc, int value, int size){ int ret = 0; if(!(sr <= row && row <= dr && sc <= col && col <= dc)) return ret; if(sr == row && sc == col) return value; if(size == 0) return ret; for(int i = 0 ; i < 4 ; i++){ int d_r = dir_r[i]; int d_c = dir_c[i]; ret = max2(ret,dfs( sr + (d_r-1)*(size/2) , sc + (d_c-1)*(size/2) , sr + d_r*(size/2) - 1 , sc + d_c*(size/2) - 1 , value + i*(size*size/4) , size/2 )); } return ret; } int main(){ scanf("%d%d%d", &n, &row, &col); int ans = 0; for(int i = 0 ; i < 4 ; i++){ int d_r = dir_r[i]; int d_c = dir_c[i]; int size = pow2(2,n); int value = size*size/4; int res = dfs( (d_r-1)*(size/2) , (d_c-1)*(size/2) , d_r*(size/2) - 1 , d_c*(size/2) - 1 , i*(size*size/4) , size/2 ); if(res != 0){ ans = res; break; } } printf("%d", ans); return 0; } | cs |