-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DFS_BFS] 4월 9일 #8
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"files.associations": { | ||
"vector": "cpp" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <stack> | ||
#include <queue> | ||
|
||
using namespace std; | ||
|
||
int n, m, v; | ||
vector<vector<int>>li; | ||
vector<bool> visited_dfs; | ||
vector<bool> visited_bfs; | ||
|
||
void dfs(int index, vector<int>& ans_dfs) { | ||
visited_dfs[index] = true; | ||
ans_dfs.push_back(index); | ||
|
||
for (int i = 1; i <= n; i++) { | ||
if (li[index][i] == 1 && !visited_dfs[i]) { | ||
dfs(i, ans_dfs); | ||
} | ||
} | ||
} | ||
|
||
void bfs(int index, vector<int>& ans_bfs) { | ||
queue<int>q; | ||
q.push(index); | ||
visited_bfs[index] = true; | ||
|
||
while (!q.empty()) { | ||
int current_v = q.front(); | ||
q.pop(); | ||
ans_bfs.push_back(current_v); | ||
|
||
for (int i = 1; i <= n; i++) { | ||
if (li[current_v][i] == 1 && !visited_bfs[i]) { | ||
visited_bfs[i] = true; | ||
q.push(i); | ||
} | ||
} | ||
} | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false); | ||
cin.tie(NULL); cout.tie(NULL); | ||
|
||
cin >> n >> m >> v; | ||
|
||
li.assign(n + 1, vector<int>(n + 1, 0)); | ||
visited_bfs.assign(n + 1, false); | ||
visited_dfs.assign(n + 1, false); | ||
|
||
for (int i = 0; i < m; i++) { | ||
int a, b; | ||
cin >> a >> b; | ||
li[a][b] = li[b][a] = 1; | ||
} | ||
|
||
vector<int>ans_dfs, ans_bfs; | ||
dfs(v, ans_dfs); | ||
bfs(v,ans_bfs); | ||
|
||
for (int i : ans_dfs) { | ||
cout << i << " "; | ||
} | ||
cout << "\n"; | ||
|
||
for (int i : ans_bfs) { | ||
cout << i << " "; | ||
} | ||
cout << "\n"; | ||
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <queue> | ||
|
||
using namespace std; | ||
|
||
int n, m; | ||
vector<vector<int>>board; | ||
vector<vector<bool>> visited_bfs; | ||
int total_time; //치즈가 모두 녹아서 없어지는 시간 | ||
int cheese_cnt; //녹기 한 시간 전 남아 있는 치즈개수 | ||
int dx[] = { 1,-1,0,0 }; | ||
int dy[] = { 0,0,1,-1 }; | ||
|
||
|
||
// 한 시간 마다 녹을 수 있는 치즈 위치를 갱신 | ||
// 갱신해준 치즈는 결국 공기가 된다. | ||
// 공기 위치로 동서남북 방향으로 탐색하며 녹을 수 있는 치즈 검사 | ||
void bfs() { | ||
queue<pair<int, int>>q; //검사해야하는 공기 위치를 담고 있음 | ||
queue<pair<int, int>>tmp; // 가장자리 치즈를 담고 있음 | ||
|
||
q.push(make_pair(0, 0)); | ||
|
||
while (!q.empty()) { // 이 while문이 끝나는 경우 : 치즈가 전부 녹는거 | ||
cheese_cnt = q.size(); //cheese_cnt 갱신 | ||
|
||
while (!q.empty()) { // 한 시간안에 녹을 수 있는 치즈에 대한 탐색 | ||
int x = q.front().first; | ||
int y = q.front().second; | ||
q.pop(); | ||
|
||
for (int i = 0; i < 4; i++) { //동서남북 방향 검사 | ||
int new_x = x + dx[i]; | ||
int new_y = y + dy[i]; | ||
|
||
if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < m) { | ||
// 1. 방문한 적 없고, 녹을 수 있는 치즈 | ||
if (!visited_bfs[new_x][new_y] && board[new_x][new_y] == 1) { | ||
tmp.push(make_pair(new_x, new_y)); | ||
} | ||
// 2. 방문한 적 없고, 공기의 위치 | ||
else if (!visited_bfs[new_x][new_y] && board[new_x][new_y] == 0) { | ||
q.push(make_pair(new_x, new_y)); | ||
} | ||
|
||
visited_bfs[new_x][new_y] = true; //해당 행, 열 위치에 대한 방문처리 | ||
//없으면 무한 루프 돈다!! | ||
} | ||
} | ||
} | ||
while (!tmp.empty()) { | ||
q.push(tmp.front()); | ||
tmp.pop(); | ||
} | ||
total_time++; | ||
} | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false); | ||
cin.tie(NULL); cout.tie(NULL); | ||
|
||
total_time = 0; | ||
cheese_cnt = 0; | ||
cin >> n >> m; | ||
|
||
board.assign(n , vector<int>(m)); //입력 받으니 굳이 0으로 초기화하지 않아도 됨. | ||
visited_bfs.assign(n, vector<bool>(m, 0)); | ||
|
||
for (int i = 0; i < n; i++) { | ||
for (int j = 0; j < m; j++) { | ||
cin >> board[i][j]; | ||
} | ||
} | ||
|
||
visited_bfs[0][0] = true; | ||
bfs(); | ||
|
||
cout << total_time - 1 << "\n"; | ||
cout << cheese_cnt << "\n"; | ||
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <stack> | ||
#include <queue> | ||
|
||
using namespace std; | ||
|
||
int n, m; | ||
vector<vector<int>>li; | ||
vector<bool> visited_bfs; | ||
|
||
|
||
void bfs(int index) { | ||
queue<int>q; | ||
q.push(index); | ||
visited_bfs[index] = true; | ||
|
||
while (!q.empty()) { | ||
int current_v = q.front(); | ||
q.pop(); | ||
|
||
for (int i = 1; i <= n; i++) { | ||
if (li[current_v][i] == 1 && !visited_bfs[i]) { | ||
visited_bfs[i] = true; | ||
q.push(i); | ||
} | ||
} | ||
} | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false); | ||
cin.tie(NULL); cout.tie(NULL); | ||
|
||
cin >> n >> m; | ||
|
||
li.assign(n + 1, vector<int>(n + 1, 0)); | ||
visited_bfs.assign(n + 1, false); | ||
|
||
for (int i = 0; i < m; i++) { | ||
int a, b; | ||
cin >> a >> b; | ||
li[a][b] = li[b][a] = 1; | ||
} | ||
|
||
bfs(1); | ||
|
||
int cnt = 0; | ||
for (int i : visited_bfs) { | ||
if (visited_bfs[i] == true) { | ||
cnt++; | ||
} | ||
} | ||
|
||
cout << cnt - 1; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3: 입출력 모두 메인에서 관리하는 것 너무 좋습니다 👍 |
||
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
#include <iostream> | ||
#include <vector> | ||
|
||
using namespace std; | ||
const int SIZE = 20; //미리 바둑판 크기 정의 | ||
|
||
// 오른쪽 위, 오른쪽, 오른쪽 아래, 아래로 이동 (왼쪽 위가 기준이기 때문.) | ||
const vector<int> dx = { -1, 0, 1, 1}; | ||
const vector<int> dy = { 1, 1, 1, 0}; | ||
|
||
//범위와 돌의 종류가 유효한지 확인하는 함수 | ||
bool isValid(vector<vector<int>>& board, int x, int y, int color) { | ||
//조건이 전부 만족하면 true를 반환한다. | ||
return (x > 0 && x < SIZE && y>0 && y < SIZE && board[x][y] == color); | ||
} | ||
|
||
//해당 좌표 (x,y)부터 연속적으로 5알이 놓이는지 확인하는 함수 | ||
bool checkWin(vector<vector<int>>& board, int x, int y) { | ||
int color = board[x][y]; // 기준 색 | ||
|
||
for (int idx = 0; idx < 4; idx++) { | ||
int cnt = 1; | ||
//이전 x,y 정의 | ||
int px = x - dx[idx]; | ||
int py = y - dy[idx]; | ||
|
||
//다음 x,y 정의 | ||
int nx = x + dx[idx]; | ||
int ny = y + dy[idx]; | ||
|
||
if (isValid(board, px, py, color)) { | ||
//이전에도 같은 알이 존재했다면 6알이 되므로 continue로 뛰어넘음. | ||
continue; | ||
} | ||
|
||
// cnt=6인 경우까지 세보기. 연속 5알이 같은 색인지 확인. | ||
while (isValid(board, nx, ny, color) && cnt < 6) { | ||
nx += dx[idx]; | ||
ny += dy[idx]; | ||
cnt++; | ||
} | ||
|
||
// cnt가 5일 때만 true 리턴 | ||
// (-> 다섯 알보다 적거나 다섯 알보다 많이 놓이는 경우를 제외) | ||
if (cnt == 5) { | ||
return true; //승리했을 때 | ||
} | ||
} | ||
|
||
return false; //승리한 사람 없을 때 | ||
} | ||
|
||
int main() { | ||
ios::sync_with_stdio(false); | ||
cin.tie(NULL); cout.tie(NULL); | ||
|
||
vector<vector<int>>board; | ||
board.assign(SIZE, vector<int>(SIZE, 0)); | ||
|
||
for (int i = 1; i < SIZE; i++) { | ||
for (int j = 1; j < SIZE; j++) { | ||
cin >> board[i][j]; //board 입력 | ||
} | ||
} | ||
|
||
for (int i = 1; i < SIZE; i++) { | ||
for (int j = 1; j < SIZE; j++) { | ||
// 빈칸이면 패스 | ||
// 빈칸 아니면 해당 좌표부터 연속적으로 놓여있는지 확인. | ||
if (board[i][j] == 0) { | ||
continue; | ||
} | ||
if (checkWin(board, i, j)) { | ||
cout << board[i][j] << "\n"; | ||
cout << i << ' ' << j; | ||
return 0; // 결과 출력 후 바로 종료 | ||
} | ||
|
||
} | ||
} | ||
|
||
cout << 0; | ||
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <stack> | ||
#include <queue> | ||
|
||
using namespace std; | ||
|
||
vector<vector<int>>li; | ||
vector<int> visited_bfs; | ||
|
||
void bfs(int index,int n) { | ||
queue<int>q; | ||
q.push(index); | ||
|
||
while (!q.empty()) { | ||
int current_v = q.front(); | ||
q.pop(); | ||
|
||
for (int i = 1; i <= n; i++) { | ||
if (li[current_v][i] != 0 && visited_bfs[i] == 0) { | ||
visited_bfs[i] = visited_bfs[current_v] + 1; | ||
q.push(i); | ||
} | ||
} | ||
} | ||
} | ||
Comment on lines
+11
to
+26
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3: 두 문제 모두 bfs를 이용하여 문제 풀이 잘 해주셨네요~! 최고입니다 |
||
|
||
int main() { | ||
ios::sync_with_stdio(false); | ||
cin.tie(NULL); cout.tie(NULL); | ||
Comment on lines
+29
to
+30
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3: 입출력 시간 관리 너무 좋습니다 👍 |
||
|
||
int n, a, b, m; | ||
cin >> n >> a >> b >> m; | ||
|
||
li.assign(n + 1, vector<int>(n + 1, 0)); | ||
visited_bfs.assign(n + 1, false); | ||
|
||
for (int i = 0; i < m; i++) { | ||
int x, y; | ||
cin >> x >> y; | ||
li[x][y] = li[y][x] = 1; | ||
} | ||
|
||
bfs(a,n); | ||
|
||
if (visited_bfs[b] == 0) { | ||
visited_bfs[b] = -1; | ||
} | ||
cout << visited_bfs[b]; | ||
|
||
return 0; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P3: bfs를 이용하여 문제 풀이 잘해주셨네요!
주석이 있다면 더더욱 좋을 것 같습니다ㅎㅎ