๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 2580๋ฒˆ - ์Šค๋„์ฟ 

by ์•ˆ์ฃผํ˜• 2022. 8. 21.

๋ฌธ์ œ

 

2580๋ฒˆ: ์Šค๋„์ฟ 

์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ, ์„ธ๋กœ ๊ฐ๊ฐ 9๊ฐœ์”ฉ ์ด 81๊ฐœ์˜ ์ž‘์€ ์นธ์œผ๋กœ ์ด๋ฃจ

www.acmicpc.net

 

์ฝ”๋“œ

#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';
    }
    
}

๋Œ“๊ธ€