Skip to content

Commit

Permalink
2021_14_정환훈
Browse files Browse the repository at this point in the history
2021_14_정환훈
  • Loading branch information
ParangBird authored Aug 24, 2022
1 parent 757c33c commit e875b6b
Show file tree
Hide file tree
Showing 3 changed files with 321 additions and 0 deletions.
129 changes: 129 additions & 0 deletions 2021/14주차/정환훈/1890_점프.cpp
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;
}
109 changes: 109 additions & 0 deletions 2021/14주차/정환훈/1937_욕심쟁이 판다.cpp
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;
}
83 changes: 83 additions & 0 deletions 2021/14주차/정환훈/5557_1학년.cpp
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;
}

0 comments on commit e875b6b

Please sign in to comment.