段错误求助
  • 板块学术版
  • 楼主幽灵特工
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/3/25 20:45
  • 上次更新2023/11/5 01:37:30
查看原帖
段错误求助
332549
幽灵特工楼主2021/3/25 20:45

这是一个数独游戏

题面略去,给样例。代码在最下面,有很全的注释

求帮忙看看我的代码哪里有问题会导致段错误,以及应该怎么改可以做对这题

样例输入

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;
        }
    }
}
2021/3/25 20:45
加载中...