diff --git "a/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1890_\354\240\220\355\224\204.cpp" "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1890_\354\240\220\355\224\204.cpp" new file mode 100644 index 0000000..dd71c3b --- /dev/null +++ "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1890_\354\240\220\355\224\204.cpp" @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +using namespace std; + +int n; +int board[101][101]; +long long way[101][101]; + +void input() { + ios_base::sync_with_stdio(0); + cin.tie(0); + cout.tie(0); + cin >> n; + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + cin >> board[i][j]; + way[i][j] = 0; + } + } +} + + +void solve2() { + + way[1][1] = 1; + + for (int i = 1; i <= n; i++) { // 세로 + for (int j = 1; j <= n; j++) { // 가로 + if (i == n && j == n) { // 끝칸 도달시 해당 칸 길 가지수 출력 + cout << way[n][n]; + return; + } + if (way[i][j]) { // 도달 할 수 있는 블록일 시 + int jump = board[i][j]; // 점프할 칸수 + if (i + jump <= n) // 세로 점프 가능 + way[i + jump][j] += way[i][j]; // 점프한 곳에 기록 + if (j + jump <= n) // 가로 점프 가능 + way[i][j + jump] += way[i][j]; // 점프한 곳에 기록 + } + } + } + + //cout << endl; + //for (int i = 1; i <= 4; i++) { + // for (int j = 1; j <= 4; j++) { + // cout << way[i][j] << " "; + // } + // cout << endl; + //} + + +} + +void dfs(int i, int j) { // dfs로 구현. 당연히 될리가 없다 + int jump = board[i][j]; + + if (jump == 0) return; + + if (i + jump <= n) { + way[i + jump][j]++; + dfs(i + jump, j); + } + if (j + jump <= n) { + way[i][j + jump]++; + dfs(i, j + jump); + } +} + +void solve() { // 0 ~ 9 사이라는 걸로 0~9칸 전까지 확인하는 식으로 했는데 시간초과 + + int garo = 1; + while (garo < n) { + if (garo + board[1][garo] <= n) { + garo = garo + board[1][garo]; + way[1][garo]++; + } + else break; + } + + int sero = 1; + while (sero < n) { + if (sero + board[sero][1] <= n) { + sero = sero + board[sero][1]; + way[sero][1]++; + } + else break; + } + + for (int i = 2; i <= n; i++) { + for (int j = 2; j <= n; j++) { + int temp = 1; + while (j - temp >= 1 && temp <= 9) { + if (board[i][j - temp] == temp) { + way[i][j] += way[i][j - temp]; + } + temp++; + } + temp = 1; + while (i - temp >= 1 && temp <= 9) { + if (board[i - temp][j] == temp) { + way[i][j] += way[i - temp][j]; + } + temp++; + } + } + } + + cout << endl; + for (int i = 1; i <= 4; i++) { + for (int j = 1; j <= 4; j++) { + cout << way[i][j] << " "; + } + cout << endl; + } + + cout << way[n][n]; + +} + + +int main() { + input(); + solve2(); + return 0; +} \ No newline at end of file diff --git "a/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1937_\354\232\225\354\213\254\354\237\201\354\235\264 \355\214\220\353\213\244.cpp" "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1937_\354\232\225\354\213\254\354\237\201\354\235\264 \355\214\220\353\213\244.cpp" new file mode 100644 index 0000000..3396922 --- /dev/null +++ "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/1937_\354\232\225\354\213\254\354\237\201\354\235\264 \355\214\220\353\213\244.cpp" @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +using namespace std; + +int n; +int board[501][501]; +bool v[501][501] = { false, }; +int d[501][501]; +int dx[4] = { -1,1,0,0 }; +int dy[4] = { 0,0,-1,1 }; +void input() { + ios_base::sync_with_stdio(0); + cin.tie(0); + cout.tie(0); + cin >> n; + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + int t; + cin >> board[i][j]; + d[i][j] = -1; + } + } +} + +int dfs(int x, int y) { + if (d[x][y] == -1) { + + d[x][y] = 1; // 해당 칸에서 하루 먹고살수있다 + int t = 0; + + for (int i = 0; i < 4; i++) { // 상하좌우 + int nx = x + dx[i]; + int ny = y + dy[i]; + if (nx >= 1 && ny >= 1 && nx <= n && ny <= n && board[x][y] < board[nx][ny]) { // 조건 부합 + t = max(t, dfs(nx, ny)); // t = max(상,하,좌,우) + } + } + d[x][y] += t; // 갈 수 있는 곳중에서 얻은 가장 큰 값을 더함 + } + + return d[x][y]; +} + +void dfs(pair id, int depth, int x, int y) { + + d[id.first][id.second] = max(depth, d[id.first][id.second]); + + for (int i = 0; i < 4; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + int s = board[x][y]; + if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && s < board[nx][ny] && v[nx][ny] == false) { + v[nx][ny] = true; + dfs(id, depth + 1, nx, ny); + v[nx][ny] = false; + } + } + +} + + +/* +1 3 1 2 +3 2 3 4 +2 1 4 1 +3 4 1 2 +*/ + + +void solve() { + + int ans = 0; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + ans = max(ans, dfs(i, j)); + } + } + + cout << ans; + + //for (int i = 1; i <= n; i++) { + // for (int j = 1; j <= n; j++) { + // dfs(make_pair(i, j), 1, i, j); + // } + //} + + //int m = d[1][1]; + //for (int i = 1; i <= n; i++) { + // for (int j = 1; j <= n; j++) { + // if (m < d[i][j]) + // m = d[i][j]; + // cout << d[i][j] << " "; + // } + // cout << endl; + //} + + ////cout << m; + +} + +int main() { + input(); + solve(); + return 0; +} \ No newline at end of file diff --git "a/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/5557_1\355\225\231\353\205\204.cpp" "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/5557_1\355\225\231\353\205\204.cpp" new file mode 100644 index 0000000..a10952d --- /dev/null +++ "b/2021/14\354\243\274\354\260\250/\354\240\225\355\231\230\355\233\210/5557_1\355\225\231\353\205\204.cpp" @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +using namespace std; + +int n; +long long d[200][200]; // dp[a][b] = a까지 왔을 때 결괏값이 b인 경로 개수 +vector numbers; +void input() { + ios_base::sync_with_stdio(0); + cin.tie(0); + cout.tie(0); + cin >> n; + for (int i = 0; i < n; i++) { + int t; + cin >> t; + numbers.push_back(t); + } +} + +// 11 +// 8 3 2 4 8 7 2 4 0 8 8 +// d[1][8]=1 +// d[2][11] = 1 d[2][5] = 1 +// d[3][13] = 1 d[3][9] = 1 d[3][7] = 1 d[3][3] = 1 + +void dfs(int now, int depth) { + if (depth == numbers.size() - 1) { + if (now == numbers.back()) { + //answers++; + return; + } + } + if (now + numbers[depth] >= 0 && now + numbers[depth] <= 20) { + dfs(now + numbers[depth], depth + 1); + } + if (now - numbers[depth] >= 0 && now - numbers[depth] <= 20) { + dfs(now - numbers[depth], depth + 1); + } +} + +void solve() { + + for (int i = 1; i <= n; i++) { // 0으로 초기화 + for (int j = 1; j <= n; j++) { + d[i][j] = 0; + } + } + + d[1][numbers.front()] = 1; // 시작 지점은 1로 두고 + + for (int i = 1; i < n; i++) { // 몇칸까지 왔는지? + for (int j = 0; j <= 20; j++) { // 현재까지 계산 결과는 뭔지? + if (d[i][j]) { // 길이 있으면 + if (j + numbers[i] <= 20) { // 지금까지의 계산 결과에 현재 값을 더해서 범위 안이면 + d[i + 1][j + numbers[i]] += d[i][j]; // 다음 계산 결과에 그만큼 길이 있음 + } + if (j - numbers[i] >= 0) { // 지금까지의 계산 결과에 현재 값을 빼서 범위 안이면 + d[i + 1][j - numbers[i]] += d[i][j]; // 다음 계산 결과에 그만큼 길이 있음 + } + } + } + } + + + for (int i = 1; i <= n; i++) { + for (int j = 0; j <= 20; j++) { + cout << d[i][j] << " "; + } + cout << endl; + } + // 등호로 연결되므로 마지막 - 1 에 도착하였을 때, 그 값이 마지막 값과 같은 경로 + cout << d[n - 1][numbers.back()]; + +} + +int main() { + input(); + solve(); + return 0; +} \ No newline at end of file