Skip to content

Commit e875b6b

Browse files
authored
2021_14_정환훈
2021_14_정환훈
1 parent 757c33c commit e875b6b

File tree

3 files changed

+321
-0
lines changed

3 files changed

+321
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <vector>
4+
#include <algorithm>
5+
#include <queue>
6+
using namespace std;
7+
8+
int n;
9+
int board[101][101];
10+
long long way[101][101];
11+
12+
void input() {
13+
ios_base::sync_with_stdio(0);
14+
cin.tie(0);
15+
cout.tie(0);
16+
cin >> n;
17+
18+
for (int i = 1; i <= n; i++) {
19+
for (int j = 1; j <= n; j++) {
20+
cin >> board[i][j];
21+
way[i][j] = 0;
22+
}
23+
}
24+
}
25+
26+
27+
void solve2() {
28+
29+
way[1][1] = 1;
30+
31+
for (int i = 1; i <= n; i++) { // 세로
32+
for (int j = 1; j <= n; j++) { // 가로
33+
if (i == n && j == n) { // 끝칸 도달시 해당 칸 길 가지수 출력
34+
cout << way[n][n];
35+
return;
36+
}
37+
if (way[i][j]) { // 도달 할 수 있는 블록일 시
38+
int jump = board[i][j]; // 점프할 칸수
39+
if (i + jump <= n) // 세로 점프 가능
40+
way[i + jump][j] += way[i][j]; // 점프한 곳에 기록
41+
if (j + jump <= n) // 가로 점프 가능
42+
way[i][j + jump] += way[i][j]; // 점프한 곳에 기록
43+
}
44+
}
45+
}
46+
47+
//cout << endl;
48+
//for (int i = 1; i <= 4; i++) {
49+
// for (int j = 1; j <= 4; j++) {
50+
// cout << way[i][j] << " ";
51+
// }
52+
// cout << endl;
53+
//}
54+
55+
56+
}
57+
58+
void dfs(int i, int j) { // dfs로 구현. 당연히 될리가 없다
59+
int jump = board[i][j];
60+
61+
if (jump == 0) return;
62+
63+
if (i + jump <= n) {
64+
way[i + jump][j]++;
65+
dfs(i + jump, j);
66+
}
67+
if (j + jump <= n) {
68+
way[i][j + jump]++;
69+
dfs(i, j + jump);
70+
}
71+
}
72+
73+
void solve() { // 0 ~ 9 사이라는 걸로 0~9칸 전까지 확인하는 식으로 했는데 시간초과
74+
75+
int garo = 1;
76+
while (garo < n) {
77+
if (garo + board[1][garo] <= n) {
78+
garo = garo + board[1][garo];
79+
way[1][garo]++;
80+
}
81+
else break;
82+
}
83+
84+
int sero = 1;
85+
while (sero < n) {
86+
if (sero + board[sero][1] <= n) {
87+
sero = sero + board[sero][1];
88+
way[sero][1]++;
89+
}
90+
else break;
91+
}
92+
93+
for (int i = 2; i <= n; i++) {
94+
for (int j = 2; j <= n; j++) {
95+
int temp = 1;
96+
while (j - temp >= 1 && temp <= 9) {
97+
if (board[i][j - temp] == temp) {
98+
way[i][j] += way[i][j - temp];
99+
}
100+
temp++;
101+
}
102+
temp = 1;
103+
while (i - temp >= 1 && temp <= 9) {
104+
if (board[i - temp][j] == temp) {
105+
way[i][j] += way[i - temp][j];
106+
}
107+
temp++;
108+
}
109+
}
110+
}
111+
112+
cout << endl;
113+
for (int i = 1; i <= 4; i++) {
114+
for (int j = 1; j <= 4; j++) {
115+
cout << way[i][j] << " ";
116+
}
117+
cout << endl;
118+
}
119+
120+
cout << way[n][n];
121+
122+
}
123+
124+
125+
int main() {
126+
input();
127+
solve2();
128+
return 0;
129+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <vector>
4+
#include <algorithm>
5+
#include <queue>
6+
using namespace std;
7+
8+
int n;
9+
int board[501][501];
10+
bool v[501][501] = { false, };
11+
int d[501][501];
12+
int dx[4] = { -1,1,0,0 };
13+
int dy[4] = { 0,0,-1,1 };
14+
void input() {
15+
ios_base::sync_with_stdio(0);
16+
cin.tie(0);
17+
cout.tie(0);
18+
cin >> n;
19+
20+
for (int i = 1; i <= n; i++) {
21+
for (int j = 1; j <= n; j++) {
22+
int t;
23+
cin >> board[i][j];
24+
d[i][j] = -1;
25+
}
26+
}
27+
}
28+
29+
int dfs(int x, int y) {
30+
if (d[x][y] == -1) {
31+
32+
d[x][y] = 1; // 해당 칸에서 하루 먹고살수있다
33+
int t = 0;
34+
35+
for (int i = 0; i < 4; i++) { // 상하좌우
36+
int nx = x + dx[i];
37+
int ny = y + dy[i];
38+
if (nx >= 1 && ny >= 1 && nx <= n && ny <= n && board[x][y] < board[nx][ny]) { // 조건 부합
39+
t = max(t, dfs(nx, ny)); // t = max(상,하,좌,우)
40+
}
41+
}
42+
d[x][y] += t; // 갈 수 있는 곳중에서 얻은 가장 큰 값을 더함
43+
}
44+
45+
return d[x][y];
46+
}
47+
48+
void dfs(pair<int, int> id, int depth, int x, int y) {
49+
50+
d[id.first][id.second] = max(depth, d[id.first][id.second]);
51+
52+
for (int i = 0; i < 4; i++) {
53+
int nx = x + dx[i];
54+
int ny = y + dy[i];
55+
int s = board[x][y];
56+
if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && s < board[nx][ny] && v[nx][ny] == false) {
57+
v[nx][ny] = true;
58+
dfs(id, depth + 1, nx, ny);
59+
v[nx][ny] = false;
60+
}
61+
}
62+
63+
}
64+
65+
66+
/*
67+
1 3 1 2
68+
3 2 3 4
69+
2 1 4 1
70+
3 4 1 2
71+
*/
72+
73+
74+
void solve() {
75+
76+
int ans = 0;
77+
for (int i = 1; i <= n; i++) {
78+
for (int j = 1; j <= n; j++) {
79+
ans = max(ans, dfs(i, j));
80+
}
81+
}
82+
83+
cout << ans;
84+
85+
//for (int i = 1; i <= n; i++) {
86+
// for (int j = 1; j <= n; j++) {
87+
// dfs(make_pair(i, j), 1, i, j);
88+
// }
89+
//}
90+
91+
//int m = d[1][1];
92+
//for (int i = 1; i <= n; i++) {
93+
// for (int j = 1; j <= n; j++) {
94+
// if (m < d[i][j])
95+
// m = d[i][j];
96+
// cout << d[i][j] << " ";
97+
// }
98+
// cout << endl;
99+
//}
100+
101+
////cout << m;
102+
103+
}
104+
105+
int main() {
106+
input();
107+
solve();
108+
return 0;
109+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <vector>
4+
#include <algorithm>
5+
#include <queue>
6+
using namespace std;
7+
8+
int n;
9+
long long d[200][200]; // dp[a][b] = a까지 왔을 때 결괏값이 b인 경로 개수
10+
vector<int> numbers;
11+
void input() {
12+
ios_base::sync_with_stdio(0);
13+
cin.tie(0);
14+
cout.tie(0);
15+
cin >> n;
16+
for (int i = 0; i < n; i++) {
17+
int t;
18+
cin >> t;
19+
numbers.push_back(t);
20+
}
21+
}
22+
23+
// 11
24+
// 8 3 2 4 8 7 2 4 0 8 8
25+
// d[1][8]=1
26+
// d[2][11] = 1 d[2][5] = 1
27+
// d[3][13] = 1 d[3][9] = 1 d[3][7] = 1 d[3][3] = 1
28+
29+
void dfs(int now, int depth) {
30+
if (depth == numbers.size() - 1) {
31+
if (now == numbers.back()) {
32+
//answers++;
33+
return;
34+
}
35+
}
36+
if (now + numbers[depth] >= 0 && now + numbers[depth] <= 20) {
37+
dfs(now + numbers[depth], depth + 1);
38+
}
39+
if (now - numbers[depth] >= 0 && now - numbers[depth] <= 20) {
40+
dfs(now - numbers[depth], depth + 1);
41+
}
42+
}
43+
44+
void solve() {
45+
46+
for (int i = 1; i <= n; i++) { // 0으로 초기화
47+
for (int j = 1; j <= n; j++) {
48+
d[i][j] = 0;
49+
}
50+
}
51+
52+
d[1][numbers.front()] = 1; // 시작 지점은 1로 두고
53+
54+
for (int i = 1; i < n; i++) { // 몇칸까지 왔는지?
55+
for (int j = 0; j <= 20; j++) { // 현재까지 계산 결과는 뭔지?
56+
if (d[i][j]) { // 길이 있으면
57+
if (j + numbers[i] <= 20) { // 지금까지의 계산 결과에 현재 값을 더해서 범위 안이면
58+
d[i + 1][j + numbers[i]] += d[i][j]; // 다음 계산 결과에 그만큼 길이 있음
59+
}
60+
if (j - numbers[i] >= 0) { // 지금까지의 계산 결과에 현재 값을 빼서 범위 안이면
61+
d[i + 1][j - numbers[i]] += d[i][j]; // 다음 계산 결과에 그만큼 길이 있음
62+
}
63+
}
64+
}
65+
}
66+
67+
68+
for (int i = 1; i <= n; i++) {
69+
for (int j = 0; j <= 20; j++) {
70+
cout << d[i][j] << " ";
71+
}
72+
cout << endl;
73+
}
74+
// 등호로 연결되므로 마지막 - 1 에 도착하였을 때, 그 값이 마지막 값과 같은 경로
75+
cout << d[n - 1][numbers.back()];
76+
77+
}
78+
79+
int main() {
80+
input();
81+
solve();
82+
return 0;
83+
}

0 commit comments

Comments
 (0)