标签:直接 view cout 还原 string 技术 name 数字 click
题意:
给你一个9*9的未完成的数独,将其填完
思路:
暴搜
从第一个位置搜起,有数字就直接跳过搜下一个位置,没数字就填数字
。通过行,列,九宫格不能重复填数,把能填的数填进去就可以了
//By DXY 2018.04.27 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> using namespace std; #define maxn 100000 int n,m; int num[10][10]; char a[10]; bool flag; bool check(int x,int cnt) { int hang=cnt/9;//行 int lie=cnt%9;//列 for(int i=0;i<9;i++)//同行中不重复 { if(num[hang][i]==x) return false; } for(int i=0;i<9;i++)//同列中不重复 { if(num[i][lie]==x) return false; } int left=hang/3*3;//九宫格左上角的行和列 int right=lie/3*3; for(int i=left;i<left+3;i++)//九宫格中不重复 for(int j=right;j<right+3;j++) if(num[i][j]==x) return false; return true;//可以将此数填入空格中 } void dfs(int cnt) { if(cnt>80||flag)//全部填满,返回 { flag=true; return ; } if(num[cnt/9][cnt%9])//位置上有数,直接搜下一个 { dfs(cnt+1); if(flag) return ; } else { for(int i=1;i<=9;i++)//填数 { if(check(i,cnt)) { num[cnt/9][cnt%9]=i; dfs(cnt+1); if(flag) return ; num[cnt/9][cnt%9]=0;//回溯,还原现场 } } } } int main() { scanf("%d",&n); while(n--) { flag=false; for(int i=0;i<9;i++) { scanf("%s",a); for(int j=0;j<9;j++) num[i][j]=a[j]-‘0‘; } dfs(0);//从第一个位置开始搜 for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cout<<num[i][j]; } cout<<endl; } } return 0; }
标签:直接 view cout 还原 string 技术 name 数字 click
原文地址:https://www.cnblogs.com/Dxy0310/p/9534234.html