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
50 changes: 50 additions & 0 deletions 11월23일/초중급/1971039_10971.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include <iostream>
using namespace std;

int arr[11][11]; // 비용
int visited[11]; //방문 체크
int m = 987654321;

void dfs(int n, int start, int y, int sum, int cnt) {
//전부 돌고 다시 처음으로 왔을 때
if (cnt == n && start == y) {
if (m > sum)
m = sum;
return;
}

for (int x = 0; x < n; x++) {
if (arr[y][x] == 0)
continue; //못 가는 경우

if (!visited[y] && arr[y][x] > 0) {
visited[y] = true; //방문 체크
sum += arr[y][x];

if (sum <= m) { // 업데이트
//[1,2]이었으면 [2,-]로 보내줌.
dfs(n, start, x, sum, cnt + 1);
}

//방문한 기록과 합 초기화
visited[y] = false;
sum -= arr[y][x];
}
}
}

int main(void) {
int n;
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> arr[i][j];

for (int i = 0; i < n; i++) {
//각각의 점(도시)에서 시작하는 경우
dfs(n, i, i, 0, 0);
}

cout << m;
return 0;
}
89 changes: 89 additions & 0 deletions 11월23일/초중급/1971039_2580.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

vector<pair<int, int>> blank;
bool finish = false;

bool check(int a, int b, vector<vector<int>> &sudoku) {
//한줄 체크
for (int i = 0; i < 9; i++) {
if (sudoku[i][b] == sudoku[a][b] && i != a)
return false; //행 확인
if (sudoku[a][i] == sudoku[a][b] && i != b)
return false; //열 확인
}

// 3*3확인
int sa = (a / 3) * 3;
int sb = (b / 3) * 3;
for (int i = sa; i < sa + 3; i++) {
for (int j = sb; j < sb + 3; j++) {
if (i == a && j == b)
continue;
if (sudoku[i][j] == sudoku[a][b])
return false; //겹치는거 존재
}
}

//겹치는게 없다면 true반환
return true;
}

void backtracking(int n, vector<vector<int>> &sudoku) {
if (n == blank.size()) { //모든 칸 다 채움
finish = true;
return;
}

// n번째 빈칸 좌표
int a = blank[n].first;
int b = blank[n].second;

for (int i = 1; i <= 9; i++) {
sudoku[a][b] = i; // 1~9넣어보기
if (check(a, b, sudoku)) {
backtracking(n + 1, sudoku);
};

if (finish)
return; //스도쿠 완성 => 계속 리턴
}

sudoku[a][b] = 0; //못채우면 되돌리기
return;
}

vector<vector<int>> solution(vector<vector<int>> sudoku) {
// blank에 빈 공간 저장
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (sudoku[i][j] == 0)
blank.push_back(make_pair(i, j));

backtracking(0, sudoku);
return sudoku;
}

int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

//입력
vector<vector<int>> sudoku(9, vector<int>(9));
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
cin >> sudoku[i][j];

//문제 해결
auto output = solution(sudoku);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << output[i][j] << ' ';
}
cout << '\n';
}
return 0;
}