POJ 2676 sudoku dfs

来源:互联网 发布:辐射4bodyslide数据 编辑:程序博客网 时间:2024/04/29 14:42

题意:数独游戏,用1-9个数字填满9 * 9 的格子,让每行,每列,每个小的3 * 3 格子都有唯一的一个数字。

思路:简单的dfs。

代码如下:

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;char sudoku[9][20];bool rows[9][10];bool columns[9][10];bool blocks[9][10];bool dfs(int n){    if(n == 81) return true;    int x = n / 9, y = n % 9;    int id = x / 3 * 3 + y / 3;    if(sudoku[x][y] != 0)        return dfs(n+1);    else{        for(int i = 1; i <= 9; ++i){            if(!rows[x][i] && !columns[y][i] && ! blocks[id][i]){                rows[x][i] = columns[y][i] = blocks[id][i] = true;                sudoku[x][y] = i;                if(dfs(n+1)) return true;                rows[x][i] = columns[y][i] = blocks[id][i] = false;                sudoku[x][y] = 0;            }        }    }    return false;}int main(void){    //freopen("in","r",stdin);    int T;    scanf("%d",&T);    while(T--){        memset(rows,0,sizeof(rows));        memset(columns,0,sizeof(columns));        memset(blocks,0,sizeof(blocks));        for(int i = 0; i < 9; ++i)            scanf("%s",sudoku[i]);        for(int i = 0; i < 9; ++i){            for(int j = 0; j < 9; ++j){                sudoku[i][j] -= '0';                if(sudoku[i][j] != 0){                    rows[i][sudoku[i][j]] = true;                    columns[j][sudoku[i][j]] = true;                    blocks[i / 3 * 3 + j / 3][sudoku[i][j]] = true;                }            }        }        dfs(0);        for(int i = 0; i < 9; ++i)            for(int j = 0; j < 9; ++j)                sudoku[i][j] += '0';        for(int i = 0; i < 9; ++i)            printf("%s\n",sudoku[i]);    }    return 0;}


0 0
原创粉丝点击