diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d7a0151 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "files.associations": { + "queue": "cpp", + "xiosbase": "cpp", + "vector": "cpp", + "ostream": "cpp", + "iostream": "cpp", + "ios": "cpp" + } +} \ No newline at end of file diff --git a/08_DFS_BFS/1325.cpp b/08_DFS_BFS/1325.cpp new file mode 100644 index 0000000..45f249a --- /dev/null +++ b/08_DFS_BFS/1325.cpp @@ -0,0 +1,58 @@ +#include +#include +#include + +using namespace std; + +void dfs(int c, vector& visited, vector>& com, int& cnt){ + visited[c]=true; + + for(int i=0;i> trust(100001); + vector visited(100001); + vector> com(100001); + vector answer(100001); + + cin >> n >> m; + + for(int i=0;i> c1 >> c2; + com[c2].push_back(c1); + } + + for(int i=1;i<=n;i++){ + for(int j=0;j<=n;j++){ + visited[j]=false; + } + dfs(i, visited, com, cnt); + trust.push_back({i, cnt}); + cnt=1; + } + + for(int i=0;ihacking){ + hacking=trust[i].second; + } + } + + for(int i=0;i +#include + +using namespace std; + +typedef vector> matrix; //vector>를 matrix라 하겠다 선언 + +const int SIZE = 20, EMPTY = 0; //상수 선언 + +const vector dx = {-1, 0, 1, 1}; //x축 방향 정의 +const vector dy = {1, 1, 1, 0}; //y축 방향 정의 + +bool isValid(matrix &board, int x, int y, int color) { //유효한지 확인 + return (x > 0 && x < SIZE && y > 0 && y < SIZE && board[x][y] == color); //돌이 보드의 위에 있는지, 종류가 맞는지 +} + +bool checkWin(matrix &board, int x, int y) { //승리(5알이 연속으로 놓임)했는지 확인 + int color = board[x][y]; //기준이 되는 색 + + for (int idx = 0; idx < 4; idx++) { //4번 반복 + int cnt = 1; //같은 방향으로 몇 개의 돌이 놓였는지 셀 변수 + int prev_x = x - dx[idx], prev_y = y - dy[idx]; //현재 돌의 이전 돌 + int next_x = x + dx[idx], next_y = y + dy[idx]; //현재 돌의 다음 돌 + + if (isValid(board, prev_x, prev_y, color)) { //유효하다면, 이전 돌도 같은 색이었다면 + continue; //건너 뜀(6목 방지 위함) + } + + while (isValid(board, next_x, next_y, color) && cnt < 6) { //같은 방향으로 놓인 5알이 같은 색인지 확인 + next_x += dx[idx]; //다음 돌 추가 + next_y += dy[idx]; //다음 돌 추가 + cnt++; //돌 세기 + } + if (cnt == 5) { //5알만 연속으로 놓였을 경우 + return true; //true 리턴 + } + } + return false; //아닐 경우 false 리턴 +} + +int main() { //메인 + matrix board(SIZE, vector(SIZE, 0)); //바둑 보드 + for (int i = 1; i < SIZE; i++) //가로 길이동안 + for (int j = 1; j < SIZE; j++) //세로 길이동안 + cin >> board[i][j]; //보드 위의 돌 입력받기 + + for (int y = 1; y < SIZE; y++) { //세로 길이동안 + for (int x = 1; x < SIZE; x++) { //가로 길이동안 + if (board[x][y] == EMPTY) { //돌이 없는 칸일 시 + continue; //건너뜀 + } + if (checkWin(board, x, y)) { //현재 돌로부터 연속으로 5알만 놓였다면 + cout << board[x][y] << '\n' //이 돌의 색상 출력 + << x << ' ' << y; //이 돌의 좌표 출력 + return 0; //종료 + } + } + } + cout << 0; //모두 아닐 경우 0 출력 +} diff --git a/08_DFS_BFS/2615_wrong.cpp b/08_DFS_BFS/2615_wrong.cpp new file mode 100644 index 0000000..ab4635f --- /dev/null +++ b/08_DFS_BFS/2615_wrong.cpp @@ -0,0 +1,104 @@ +#include +#include + +using namespace std; + +bool is_valid(int x, int y){ + return (x>=0 && x<19 && y>=0 && y<19); +} + +bool check(int num, int x, int y, vector>& dir, vector>& board, int& dir_5){ + for(int d=0; d<4; d++){ + int count=1; + int dx=dir[d][0]; + int dy=dir[d][1]; + + for(int i=1; i<=4; i++){ + int nx=x+i*dx; + int ny=y+i*dy; + + if(is_valid(nx, ny) && board[nx][ny]==num){ + count++; + } + else{ + break; + } + } + + if(count==5){ + int dx_6=dir[dir_5][0], dy_6=dir[dir_5][1]; + if(is_valid(x-dx_6, y-dy_6) && board[x-dx_6][y-dy_6]==num){ + return false; + } + return true; + } + } + return false; +} + +bool six_check(int num, int x, int y, vector>& dir, vector>& board, int& dir_5){ + for(int d=0; d<4; d++){ + int count=1; + int dx=dir[d][0]; + int dy=dir[d][1]; + + for(int i=1; i<=5; i++){ + int nx=x+i*dx; + int ny=y+i*dy; + + if(is_valid(nx, ny) && board[nx][ny]==num){ + count++; + } + else{ + break; + } + } + + if(count>5){ + dir_5=d; + return true; + } + } + return false; +} + +int main() +{ + ios_base::sync_with_stdio(false); + cin.tie(NULL); cout.tie(NULL); + + int winner, x_result, y_result, dir_5=2; + vector> board(19,vector (19)); + vector> dir={{1, 0}, {0, 1}, {1, 1}, {1, -1}}; + + for(int i=0; i<19; i++){ + for(int j=0; j<19; j++){ + cin >> board[i][j]; + } + } + + for(int i=0; i<19; i++){ + for(int j=0; j<19; j++){ + if(board[i][j]!=0){ + if(!six_check(board[i][j], i, j, dir, board, dir_5)){ + if(check(board[i][j], i, j, dir, board, dir_5)){ + winner=board[i][j]; + x_result=i+1; + y_result=j+1; + break; + } + } + } + } + if(winner!=0){ + break; + } + } + + cout << winner << '\n'; + if(winner!=0){ + cout << x_result << " " << y_result; + } + + return 0; +} diff --git a/08_DFS_BFS/4963.cpp b/08_DFS_BFS/4963.cpp new file mode 100644 index 0000000..7e227d4 --- /dev/null +++ b/08_DFS_BFS/4963.cpp @@ -0,0 +1,62 @@ +#include +#include +#include + +using namespace std; + +vector dir_x={-1, 1, -1, 1, 0, 0, -1, 1}; +vector dir_y={-1, 1, 1, -1, 1, -1, 0, 0}; +int board[50][50]; +bool visited[50][50]={false,}; + +bool is_ok(int x, int y, int w, int h){ + return (x>=0 && x=0 && y> w >> h; + + if(w==0 && h==0){ + break; + } + for(int i=0; i> board[i][j]; + } + } + for(int i=0; i