Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions 11월23일/초중급/2176278_10971.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <iostream>
#define MAX 1e9;
using namespace std;

int N, w[10][10]; //총 나라 개수, 가중치 저장
int minCost = MAX; //최소 비용 (cost 중 최솟값)
bool visited[10] = { false, };

void dfs(int start, int curr, int cnt, int cost) {
if (cnt == N) { //base case
//돌아갈 수 있으면, 출발점으로 다시 돌아가기
if(w[curr][start] != 0 && minCost > cost + w[curr][start])
minCost = cost + w[curr][start];
return;
}

for (int next = 0; next < N; next++) {
if (visited[next] || w[curr][next] == 0)
continue;

visited[curr] = 1;

dfs(start, next, cnt + 1, cost + w[curr][next]);

// 원상복구
visited[curr] = 0;
}
}


int main() {
cin >> N;

for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> w[i][j];
}
}

for (int i = 0; i < N; i++) {
visited[i] = 1;
dfs(i, i, 1, 0); //시작점, 현재 위치, 지나온 나라 수, 여태까지의 비용
visited[i] = 0;
}

cout << minCost;

return 0;
}
74 changes: 74 additions & 0 deletions 11월23일/초중급/2176278_2580.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include <iostream>
#include <vector>

using namespace std;

int sdoqu[9][9];
vector<pair<int, int>> v_empty;
int cnt = 0; // 빈 칸의 총 개수
bool is_full = false; // 스도쿠 다 채웠나

bool check(pair<int, int> p){
for (int i = 0; i < 9; i++) {
// 가로 : 같은 행에 같은 숫자가 있으면
if (sdoqu[p.first][i] == sdoqu[p.first][p.second] && i != p.second)
return false;
// 세로 : 같은 열에 같은 숫자가 있으면
if (sdoqu[i][p.second] == sdoqu[p.first][p.second] && i != p.first)
return false;
}

// 작은 사각형 : 같은 구역에 같은 숫자가 있으면
int square_x = p.first / 3;
int square_y = p.second / 3;
for (int i = 3 * square_x; i < 3 * square_x + 3; i++)
for (int j = 3 * square_y; j < 3 * square_y + 3; j++) {
if (sdoqu[i][j] == sdoqu[p.first][p.second]) {
if (i != p.first && j != p.second)
return false;
}
}

return true; // 같은 숫자가 없으면 --> 그 숫자로 채울 수 있음.
}

void find(int n) { // n : 이번에 채울 빈칸 번호 (몇 번째? 0 ~ cnt - 1)

// base case
if (n == cnt) { // 스도쿠 다 채우면
is_full = true;

for (int i = 0; i < 9; i++) { //출력
for (int j = 0; j < 9; j++)
cout << sdoqu[i][j] << " ";
cout << '\n';
}
return;
}

for (int j = 1; j <= 9; j++) {
sdoqu[v_empty[n].first][v_empty[n].second] = j; // 하나씩 넣어보면서
if (check(v_empty[n])) // 가능하면
find(n + 1); // 그대로 두고 다음 빈칸을 채우기

if (is_full) return; // 이미 다 채웠을 경우 --> 함수 종료
}
sdoqu[v_empty[n].first][v_empty[n].second] = 0; // 값을 채우지 않고 빈칸으로 남기는 경우도 고려해주기.
return;
}

int main() {
/*입력 받기*/
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> sdoqu[i][j];
if (sdoqu[i][j] == 0) {
v_empty.push_back({ i, j });
cnt++;
}
}
}

/*스도쿠 채우기*/
find(0);
}