题解 P1784 【数独】
实在想不出这题和矩阵有什么关系【好吧。。。用矩阵来存。。。】
DFS即可
因为是9*9,so,定义第i行第j列为n=i*9+j, i, j=0 . . 9
那么第n个数位于第n/9行第n mod 9列。。。
#include<cstdio>
int num[9][9] //定义数组
bool flag //完成的标志
bool judge(int n,int k){ //判断在第n个位置放置k是否合法
int x=n/9 //行
int y=n%9 //列
for(int i=0;i<9;i++){
if(num[i][y]==k)return false //行不合法,返回fasle
else ;
if(num[x][i]==k)return false //列不合法,返回fasle
}
int fx=(x/3)*3
int fy=(y/3)*3
for(int i=fx;i<fx+3;i++){ //九宫格内不合法,返回fasle
for(int j=fy;j<fy+3;j++){
if(num[i][j]==k)return false
}
}
return true //全合法返回true
}
void dfs(int n){
if(n>80)flag=false //n>80即为完成了,修改flag来终止所有操作
//我对爆栈有心理恐惧。。。
if(num[n/9][n%9])dfs(n+1) //如果不为0,就跳过
else if(flag){
int x=n/9
int y=n%9
for(int tem=1;tem<10;tem++){
if(judge(n,tem)){ //judge的定义见上面
num[x][y]=tem
dfs(n+1)
}
if(flag)num[x][y]=0 //如果程序进行到这里就说明上面的dfs失败了
//所以把num[x][y]复位
//可以去掉if(flag)试试结果,想想为什么。。
}
}
}
int main(){ //主函数里的不解释,上面都说完了
int i,j,k,n
for(i=0;i<9;i++)for(j=0;j<9;j++){
scanf("%d",&num[i][j])
}
flag=true
dfs(0)
for(i=0;i<9;i++){
for(j=0;j<9;j++)printf("%d ",num[i][j])
printf("\n")
}
}
[color=#636363]HINT: To Copy is FORBIDDEN... [/color]