일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바
- 삼성 SW 기출문제
- gcp
- 2018 KAKAO BLIND RECRUITMENT 1차
- 2020 KAKAO BLIND RECRUITMENT
- 부스트코스
- 카카오 공채
- 알고리즘
- 2018 KAKAO BLIND RECRUITMENT
- 젠킨스
- gradle
- 2018 카카오
- 비트마스크
- bfs
- CS 스터디
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 백준
- set
- 2018 카카오 공채
- 카카오
- c++
- map
- Java
- 2019 카카오 공채
- 2020 카카오 공채
- dfs
- 삼성 SW 역량테스트
- 2019 KAKAO BLIND RECRUITMENT
- 프로그래머스
- Baekjoon
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