일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 2018 카카오 공채
- 2018 KAKAO BLIND RECRUITMENT 1차
- 백준
- dfs
- 2018 카카오
- 젠킨스
- map
- gcp
- c++
- Baekjoon
- 카카오
- 2020 KAKAO BLIND RECRUITMENT
- 알고리즘
- 부스트코스
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- set
- 2019 KAKAO BLIND RECRUITMENT
- gradle
- 삼성 SW 역량테스트
- 비트마스크
- 2018 KAKAO BLIND RECRUITMENT
- 카카오 공채
- 삼성 SW 기출문제
- 자바
- bfs
- CS 스터디
- 프로그래머스
- 2020 카카오 공채
- 2019 카카오 공채
- Java
Archives
- Today
- Total
아무코딩
[백준 2580] 스도쿠 본문
문제풀이
너무 꼬아서 생각했다..
내가 너무 쉬운 스도쿠만 풀었는지 확실하게 유니크한 값들을 채워나가면 공백이 줄지 알고 공백들을 계속 돌려 유니크한 1개의 값을 채워나가는 방식으로 생각했는데 예외가 너무 많았다. 고려할게 2가지 이상인게 모두일때 그 방법은 무한루프 상태가 된다.
그래서 남들 처럼 dfs 방법으로 풀었다.
자리확인은 원래 bool 배열로 해도 됐으나 그전에 짠 비트마스크 코드가 아까워 그대로 사용하였다. 하고보니 그냥 간단한 dfs문제였다.
소스코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <stdio.h>
#include <stdlib.h>
using namespace std;
queue<pair<int,int>> q;
int Map[9][9];
int set_row[9];
int set_col[9];
int set_square[3][3];
bool isPossible(int row, int col,int num){
int union_num = set_row[row] | set_col[col] | set_square[row/3][col/3];
if(union_num & (1<<num))
return false;
return true;
}
void dfs(int cnt){
if(cnt==81){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d ",Map[i][j]);
}
printf("\n");
}
exit(0);
}
int row = cnt/9;
int col = cnt%9;
if(Map[row][col])
dfs(cnt+1);
else{
for(int i=1; i<=9;i++){
if(isPossible(row,col,i)){
Map[row][col] = i;
set_row[row]+= (1<<i);
set_col[col]+= (1<<i);
set_square[row/3][col/3] += (1<<i);
dfs(cnt+1);
Map[row][col] = 0;
set_row[row]-= (1<<i);
set_col[col]-= (1<<i);
set_square[row/3][col/3] -= (1<<i);
}
}
}
}
int main() {
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
int input;
scanf("%d",&input);
Map[i][j] = input;
if(input!=0){
set_row[i]+= (1<<input);
set_col[j]+= (1<<input);
set_square[i/3][j/3] += (1<<input);
}
}
}
dfs(0);
return 0;
}
|
cs |
문제 링크 : www.acmicpc.net/problem/2580
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2352] 반도체 설계 (0) | 2020.05.15 |
---|---|
[백준 17281] 야구 (0) | 2020.05.12 |
[백준 1300] k번째수 (0) | 2020.05.08 |
[백준 2252] 줄세우기 (0) | 2020.05.08 |
[백준 14499] 주사위 굴리기 (0) | 2020.05.06 |
Comments