-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
3 changed files
with
321 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
#include <iostream> | ||
#include <string> | ||
#include <vector> | ||
#include <algorithm> | ||
#include <queue> | ||
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
#include <iostream> | ||
#include <string> | ||
#include <vector> | ||
#include <algorithm> | ||
#include <queue> | ||
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<int, int> 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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
#include <iostream> | ||
#include <string> | ||
#include <vector> | ||
#include <algorithm> | ||
#include <queue> | ||
using namespace std; | ||
|
||
int n; | ||
long long d[200][200]; // dp[a][b] = a까지 왔을 때 결괏값이 b인 경로 개수 | ||
vector<int> 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; | ||
} |