chapter 7 Combinatorial Search and Heuristic Methods

7.3 sudoku##

本小節(jié)講到了怎么去用回溯的方法去解一個(gè)數(shù)獨(dú)問題,我特意去找了poj 2676這道題來試試.
下面程序用了回溯的方法,還有一種方法是用dlx算法(沒看)

#include <cstdio>
#include <iostream>
#include <map>
#include <cstring>

using namespace std;

struct node {
    int x, y;
}q[9*9+10];

bool row[10][10], col[10][10], sq[4][4][10];
int G[10][10], cnt;

bool dfs(int cn) {
    if(cn < 0) return true;
    
    int x = q[cn].x, y = q[cn].y;
    
    for(int k=1; k<=9; k++) {
        if(row[x][k] || col[y][k] || sq[x/3][y/3][k]) continue;
        row[x][k] = col[y][k] = sq[x/3][y/3][k] = true;
        
        G[x][y] = k;
        if(dfs(cn-1)) return true;
        
        row[x][k] = col[y][k] = sq[x/3][y/3][k] = false;
    }
    
    return false;
}


int main() {
    int T;
    scanf("%d", &T);
    
    while(T--) {
        cnt = 0;
        memset(row, false, sizeof(row));
        memset(col, false, sizeof(col));
        memset(sq, false, sizeof(sq));
        
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++) {
                scanf("%1d", &G[i][j]);
                int k = G[i][j];
                if(k != 0) {
                    row[i][k] = col[j][k] = sq[i/3][j/3][k] = true;
                }
                else q[cnt++] = (node){i, j}; //把未填的位置存下來
            }
        }
        
        dfs(cnt-1);
        
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++) {
                printf("%d", G[i][j]);
            }
            putchar('\n');
        }
    }
    
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容