【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国庆黄天济南培训写法