PKU 2676 Sudoku

题意很简单,解数独题.用深度优先搜索的方法从最有一个空格往前搜,(从前面搜会超时-_-)
每搜到一个空格便尝试填入1至9九个数字,每填一个数字就检查是否符合数独规则.
当填完最后一个空格是就可以输出解了(Special Judge,任何一个解都可以通过.)

224K 15MS Accepted

 

#include<iostream> using namespace std; const int n=9; int nn=81; int a[n][n]; //存储数独的数组. int dfs(int x); //深度优先搜索的函数. int check1(int x,int y); //检查行列是否符合规则 int check2(int x,int y); //检查九宫格是否符合规则. void print(); //打印数独的解. void main() { int c; cin>>c; while(c--) { int i,j; char s[11]; for(i=0;i<n;i++) { cin>>s; for(j=0;j<n;j++) a[i][j]=s[j]-'0'; //转化为数字并存入数组. } dfs(80); //开始从后向前搜索. print(); } } int dfs(int x) { if(x==-1)return 1; int i; if(a[x/n][x%n]!=0)return dfs(x-1); //如果当前格不是空格,则跳过. else for(i=1;i<=n;i++) { a[x/n][x%n]=i; //依次填入数字并检查. if(check1(x/n,x%n))if(dfs(x-1))return 1; a[x/n][x%n]=0; } return 0; } void print() { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) cout<<a[i][j]; cout<<endl; } } int check1(int x,int y) { int i; int d=a[x][y]; for(i=0;i<n;i++) if(x==i)continue; else if(a[i][y]==d)return 0; for(i=0;i<n;i++) if(y==i)continue; else if(a[x][i]==d)return 0; return check2(x,y); } int check2(int x,int y) { int c=x/3*3+y/3; int i,j; for(i=x/3*3;i<x/3*3+3;i++) { for(j=y/3*3;j<y/3*3+3;j++) { if((i==x)&&(j==y))continue; else if(a[i][j]==a[x][y])return 0; } } return 1; }

你可能感兴趣的:(c,存储,ini)