这是一个数独游戏
题面略去,给样例。代码在最下面,有很全的注释
求帮忙看看我的代码哪里有问题会导致段错误,以及应该怎么改可以做对这题
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
#include <bits/stdc++.h>
using namespace std;
int t,a[10][10],ans=0;//ans用来存放了几个数字,81个说明解完了
bool check(int x,int y,int k){//判断放置数字是否合法
for(int i=1;i<=9;i++){//行列
if(a[i][y]==k)return 0;
if(a[x][i]==k)return 0;
}
//以下九宫格
//话说不知道为什么不能用yy这个变量名,是万能头定义了吗?百度没查到
int xx,yy1;
if(x<=3)xx=1;
else if(x<=6)xx=4;
else xx=7;
if(y<=3)yy1=1;
else if(y<=6)yy1=4;
else yy1=7;
//int xx=x<=3?1:(x<=6?4:7);
//int yy1=y<=3?1:(y<=6?4:7);
for(int i=xx;i<xx+3;i++){
for(int j=yy1;j<yy1+3;j++){
if(a[i][j]==k)return 0;
}
}
return 1;
}
bool ok(){//这个我曾经用来判断是否已经解完了,但是这个函数也会段错误
for(int i=1;i<=9;i++)for(int j=1;j<=9;j++)if(a[i][j]==0)return 0;
return 1;
}
void DFS(int x,int y){
if(ans==81)return;
if(a[x][y]){
if(x+1<=9)DFS(x+1,y);
if(x-1>=1)DFS(x-1,y);
if(y+1<=9)DFS(x,y+1);
if(y-1>=1)DFS(x,y-1);
return;
}
//ans放这里就不会出错(段错误)
for(int k=1;k<=9;k++){
if(check(x,y,k)){
a[x][y]=k;
ans++;
if(x+1<=9)DFS(x+1,y);
if(x-1>=1)DFS(x-1,y);
if(y+1<=9)DFS(x,y+1);
if(y-1>=1)DFS(x,y-1);
a[x][y]=0;
}
}
}
int main(){
cin>>t;
char s;
while(t--){
//关于输入,输入没有空格所以用char读。输入绝对没有问题
for(int i=1;i<=9;i++)for(int j=1;j<=9;j++){a[i][j]=0;cin>>s;a[i][j]=s-'0';if(a[i][j]!=0)ans++;}
DFS(1,1);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)cout<<a[i][j];
cout<<endl;
}
}
}