poj 2676 Sudoku(DFS+回溯+剪枝)

2676 -- Sudoku (poj.org)
复制代码
#include<iostream>
#include<cstring>
using namespace std;
int n,map[10][10];
bool row[10][10],col[10][10],grid[10][10];
bool DFS(int r,int c){
    if(r==10) return true;
    bool flag=false;
    if(map[r][c]){
        if(c==9) flag=DFS(r+1,1);
        else flag=DFS(r,c+1);
        return flag;
    }else{
        int k=((r-1)/3)*3+(c-1)/3+1;
        for(int i=1;i<=9;i++){
            if(!row[r][i]&&!col[c][i]&&!grid[k][i]){
                map[r][c]=i;
                row[r][i]=true;
                col[c][i]=true;
                grid[k][i]=true;
                if(c==9) flag=DFS(r+1,1);
                else flag=DFS(r,c+1);
                if(!flag){
                    map[r][c]=0;
                    row[r][i]=false;
                    col[c][i]=false;
                    grid[k][i]=false;
                }else return flag;
            }    
        }
    }
    return false;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    while(n--){
        memset(row,0,sizeof(row));    
        memset(col,0,sizeof(col));
        memset(grid,0,sizeof(grid));
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                char ch;
                cin>>ch;
                map[i][j]=ch-'0';
                if(map[i][j]){
                    row[i][map[i][j]]=true;
                    col[j][map[i][j]]=true;
                    int k=((i-1)/3)*3+(j-1)/3+1;
                    grid[k][map[i][j]]=true;
                }
            }
        }
        DFS(1,1);
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                cout<<map[i][j];
            }
            cout<<endl;
        }
    }    
    return 0;
}
复制代码

 

posted @   ACCbulb  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示