diff --git "a/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_10971.cpp" "b/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_10971.cpp" new file mode 100644 index 0000000..5be7e83 --- /dev/null +++ "b/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_10971.cpp" @@ -0,0 +1,50 @@ +#include +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; +} diff --git "a/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_2580.cpp" "b/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_2580.cpp" new file mode 100644 index 0000000..6d0ecc6 --- /dev/null +++ "b/11\354\233\22423\354\235\274/\354\264\210\354\244\221\352\270\211/1971039_2580.cpp" @@ -0,0 +1,89 @@ +#include +#include +#include +using namespace std; + +vector> blank; +bool finish = false; + +bool check(int a, int b, vector> &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> &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> solution(vector> 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> sudoku(9, vector(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; +} \ No newline at end of file