<7-4> DP - 킹 나이트 체스 (ChessMetric)
PS/Topcoder training2018. 7. 1. 15:09
### DP ###
### TopCoder Collegiate Challenge 2003 Round 4 Div 1 Level 1 ###
<소스코드>
- d[r][c][rest] : (r, c) 에서 (er, ec) 까지 rest 번만에 갈 수 있는 방법의 수
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 | #include <vector> #include <cstring> using namespace std; int n, er, ec; int dr[] = {-1, -1, -1, 0, 0, 1, 1, 1, -2, -2, -1, 1, 2, 2, 1, -1}; int dc[] = {1, 0, -1, 1, -1, 1, 0, -1, 1, -1, -2, -2, -1, 1, 2, 2}; long long d[101][101][51]; bool safe(int r, int c) { return (0 <= r && r < n) && (0 <= c && c < n); } long long solve(int r, int c, int rest) { long long *ret = &d[r][c][rest]; if(rest == 0) { if(r == er && c == ec) return 1LL; return 0LL; } if(*ret != -1) return *ret; *ret = 0LL; for(int k=0; k<16; k++) { int nr = r+dr[k]; int nc = c+dc[k]; if(safe(nr, nc)) { *ret += solve(nr, nc, rest-1); } } return *ret; } class ChessMetric { public: long long howMany(int size, vector<int> start, vector<int> end, int numMoves) { int sr = start[0]; int sc = start[1]; er = end[0]; ec = end[1]; n = size; memset(d, -1, sizeof(d)); return solve(sr, sc, numMoves); } }; | cs |
'PS > Topcoder training' 카테고리의 다른 글
<7-5> DP - 악수 (HandShaking) (0) | 2018.07.04 |
---|---|
<5-7> 전체탐색 - 고장난 로봇 (CrazyBot) (0) | 2018.07.03 |
<5-4> 전체탐색 - 회문 (ThePalindrome) (0) | 2018.07.01 |
<7-3> DP - 나쁜 이웃집 사람들 (BadNeighbors) (0) | 2018.07.01 |
<7-2> DP - 회사 조직과 급여 (CorporationSalary) (0) | 2018.07.01 |