๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
int N = 9;
int map[9][9];
vector<pair<int,int>> blank; // 0 ์ขํ
bool flag = false;
int ans[9][9];
bool check(int a, int b) {
//ํ์ค ์ฒดํฌ
for (int i = 0; i < 9; i++) {
if (map[i][b] == map[a][b] && i != a) return false; //ํ ํ์ธ
if (map[a][i] == map[a][b] && i != b) return false; //์ด ํ์ธ
}
int new_a = a/3*3;
int new_b = b/3*3;
for(int i = new_a; i<new_a+3; i++){ // 3*3 ํ์ธ
for(int k = new_b; k<new_b+3; k++){
if(a == i && b == k) continue;
if(map[i][k] == map[a][b]) return false;
}
}
return true;
}
void dfs(int idx){
if(flag) return;
if(idx == blank.size()){
memcpy(ans, map, sizeof(map));
flag = true;
return;
}
int x = blank[idx].first;
int y = blank[idx].second;
for(int num = 1; num<=9; num++){
map[x][y] = num;
if(check(x,y)) dfs(idx+1);
map[x][y] = 0;
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cin>>map[i][k];
if(!map[i][k]) blank.push_back({i, k});
}
}
dfs(0);
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cout<<ans[i][k] << ' ';
}
cout<<'\n';
}
}
ํ์ด
์๊ฐ ์ด๊ณผ๊ฐ ๊ณ์ ๊ดด๋กญํ๋ ๋ฌธ์ ์์ต๋๋ค.
๋ฏธ๋ฆฌ ๋น์นธ์ ์ ๋ ฅ๋ฐ๊ณ ๋น์นธ์ ๊ธฐ์ค์ผ๋ก ์ฑ์๊ฐ๋ฉด์ ๋ฐฑํธ๋ํน์ ๋๋ฆฌ๋๋ฐ, ์ค๋์ฟ ์ ๊ท์น์ ๋ง์กฑํ ๋๋ง ๋์ ์ ์๋ ์กฐ๊ฑด์ผ๋ก ๊ตฌํํ์ต๋๋ค. ๋ค๋ง ์ค๋์ฟ ์ ๊ท์น์ ํ์ธํ๋ ๋ถ๋ถ์์ ๊ณ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ฒ์์ ์์ฑํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์๋ฐ, ํ๊ณผ ์ด์ ํ์ธํ๋ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ์์ผ๋ 3*3์ ํ์ธํ๋ ๋ถ๋ถ์์ ๊ณ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํด์ ์ ๋ถ๋ถ๋ง ์ ์ ๋ต ์ฝ๋์ฒ๋ผ ๋ฐ๊ฟ ์ฃผ์๋๋ ์ ๋ต์ด ๋ด์ต๋๋ค. ์๊ฐ๋ณต์ก๋ ์ธก๋ฉด์์๋ ๋๊ฐ์ ๊ฒ ๊ฐ์๋ฐ, ์์ง ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
#include <iostream>
#include <unordered_map>
#include <vector>
#include <memory.h>
using namespace std;
int N = 9;
int map[9][9];
vector<pair<int,int>> blank; // 0 ์ขํ
bool flag = false;
int ans[9][9];
bool is_width_height_valid(int x, int y){
int val = map[x][y];
for(int i=0; i<9; i++){ // width
if(i == y) continue;
if(val == map[x][i]) return false;
}
for(int i=0; i<9; i++){ // height
if(i == x) continue;
if(val == map[i][y]) return false;
}
return true;
}
bool is_square_valid(int x, int y){
if(x>=0 && x<3) x = 0;
else if(x >=3 && x<6) x = 3;
else x = 6;
if(y>=0 && y<3) y = 0;
else if(y >=3 && y<6) y = 3;
else y = 6;
unordered_map<int,int> cnt;
for(int i=x; i<x+3; i++){
for(int k=y; k<y+3; k++){
if(!map[i][k]) continue;
int val = map[i][k];
if(cnt[val]) return false;
cnt[val] = 1;
}
}
return true;
}
void dfs(int idx){
if(flag) return;
if(idx == blank.size()){
memcpy(ans, map, sizeof(map));
flag = true;
return;
}
int x = blank[idx].first;
int y = blank[idx].second;
for(int num = 1; num<=9; num++){
map[x][y] = num;
if(is_width_height_valid(x, y) && is_square_valid(x, y)){
dfs(idx+1);
}
map[x][y] = 0;
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cin>>map[i][k];
if(!map[i][k]) blank.push_back({i, k});
}
}
cout<<'\n';
dfs(0);
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cout<<ans[i][k] << ' ';
}
cout<<'\n';
}
}
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 15658๋ฒ - ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (2) (0) | 2022.08.23 |
---|---|
[๋ฐฑ์ค,c++] 6443๋ฒ - ์ ๋๊ทธ๋จ (0) | 2022.08.21 |
[๋ฐฑ์ค,c++] 3980๋ฒ - ์ ๋ฐ ๋ช ๋จ (0) | 2022.08.21 |
[๋ฐฑ์ค,c++] 2661๋ฒ - ์ข์์์ด (0) | 2022.08.21 |
[๋ฐฑ์ค,c++] 18430๋ฒ - ๋ฌด๊ธฐ ๊ณตํ (0) | 2022.08.21 |
[๋ฐฑ์ค,c++] 1174๋ฒ - ์ค์ด๋๋ ์ (0) | 2022.08.21 |
๋๊ธ