【P1784 数独】典型dfs+回溯 (参考黄天写法)

https://www.luogu.org/problemnew/show/P1784 洛谷地址

 

#include<cstdio>
using namespace std; 
bool hang[10][10], lie[10][10], squ[10][10];
int res[100][100],a[100][100];
 
void search(int x,int y) 
{                             //当前到了第x行第y列 
    if (x>9) 
    { for (int i=1; i<=9; i++)
        {
            for (int j=1; j<=9; j++)
            printf("%d ",res[i][j]);
            printf("\n");
        } 
        return; 
    }
    
    if (a[x][y]!=0) {//当前位置是固定格子 
        res[x][y] = a[x][y];
        if (y==9) search(x+1,1); else search(x,y+1);
    }
    else
        for (int i=1; i<=9; i++) {//枚举第x行第y列填的数字是i 
            //确保填进去不会出现问题
            int tmp = ((x-1)/3)*3 + (y+2)/3; //算出(x,y)对应的方阵编号 
            if (!hang[x][i] && !lie[y][i] && !squ[tmp][i]) { 
                res[x][y]=i;
                hang[x][i]=lie[y][i]=squ[tmp][i]=true;
                if (y==9) search(x+1,1); else search(x,y+1); 
                hang[x][i]=lie[y][i]=squ[tmp][i]=false;
            }
        }
} 

int main() 
{
    /*
    hang[i][j]表示第i行数字j用过与否 
    lie[i][j]表示第i列数字j用过与否 
    squ[i][j]表示第i个方阵数字j用过与否 
    */ 

    for (int i=1; i<=9; i++) 
        for (int j=1; j<=9; j++) 
        {   scanf("%d",&a[i][j]); //输入数据 
            if (a[i][j]!=0) {
                hang[i][ a[i][j] ] = true;
                lie[j] [ a[i][j] ] = true;
                int tmp = ((i-1)/3)*3+(j+2)/3;
                squ[tmp] [ a[i][j] ] = true;
            }
        }
    search(1,1);
    return 0;
}
//参考2018国庆黄天济南培训写法 

 

posted on 2018-11-28 09:42  lcdxjsj  阅读(125)  评论(0编辑  收藏  举报

导航