c++验证数独问题,求代码

定义一个数独类Sudoku,定义成员数据mySudoku将题目所给的9*9的数列输入到数独类中,并编写成员函数checkAnswer()验证它是否是一个成功的数独!第一行是一个整数T,代表接下来有T组输入;每一组输入有9行,每一行9个数字,数字都是1~9的合法正整数数字对于每一组数据,如果这是一个成功的数独,输出“Yeah!”(不包含双引号)和一个换行符。否则输出“Oh,No!”(不包含双引号)和一个换行符。例如输入:21 2 3 4 5 6 7 8 94 5 6 7 8 9 1 2 37 8 9 1 2 3 4 5 62 3 4 5 6 7 8 9 15 6 7 8 9 1 2 3 48 9 1 2 3 4 5 6 73 4 5 6 7 8 9 1 26 7 8 9 1 2 3 4 59 1 2 3 4 5 6 7 81 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9输出:Yeah!Oh,No!不是类也可以,能够验证数独就行
2026年09月18日 21:16
有2个网友回答
网友(1):

把上述的数据存入文件,运行时从文件中读取:
#include
#include
int a[9][9];
int checkAnswer()
{int i,j,s,b[10],i1,j1;
 for(i=0;i<9;i++)
 {memset(b,0,sizeof(b));
  for(j=0;j<9;j++)
    b[a[i][j]]=1;
  for(j=s=0;j<10;j++)
    s+=b[j];
  if(s-9)return 0;   
 }
 for(i=0;i<9;i++)
 {memset(b,0,sizeof(b));
  for(j=0;j<9;j++)
    b[a[j][i]]=1;
  for(j=s=0;j<10;j++)
    s+=b[j];
  if(s-9)return 0;   
 }
 for(i=0;i<9;i+=3)
   for(j=0;j<9;j+=3)
   {memset(b,0,sizeof(b));
    for(i1=0;i1<3;i1++)
      for(j1=0;j1<3;j1++)
         b[a[i+i1][j+j1]]=1;
    for(j1=s=0;j1<10;j1++)
      s+=b[j1];
    if(s-9)return 0;   
   }
 return 1;  
}
int main()
{int t,i,j;
 FILE *fp;
 if((fp=fopen("d:\\0.txt","r"))==NULL)
 {printf("File open error!\n");
  return 0;
 }
 fscanf(fp,"%d",&t);
 while(t--)
 {for(i=0;i<9;i++)
    for(j=0;j<9;j++)
      fscanf(fp,"%d",&a[i][j]);
  printf("%s\n",checkAnswer()?"Yeah!":"Oh,No!");
 }
 fclose(fp);
 return 0;
}

网友(2):

#include 
using namespace std;
class Sudoku{
    int num[9][9];
public:
    Sudoku(){}
    void in();
    bool checkAnswer();
};
void Sudoku::in(){
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
            cin>>num[i][j];
}
bool judge(int a[]){
    int i,j,k,t;
    for(i=0;i<8;i++){
        k=i;
        for(j=i+1;j<9;j++)
            if (a[j]                k=j;
        if (i!=k){
            t=a[i];
            a[i]=a[k];
            a[k]=t;
        }
    }
    for(i=0;i<9;i++)
        if (a[i]!=i+1)
            return true;
    return false;
}
bool Sudoku::checkAnswer(){
    int a[9];
    int i,j,k;
    for(i=0;i<9;i++){
        for(j=0;j<9;j++)
            a[j]=num[i][j];
        if (judge(a)) return false;
        for(j=0;j<9;j++)
            a[j]=num[j][i];
        if (judge(a)) return false;
        if (i%3==0){
            j=0;
            for(k=0;k<3;k++){
                a[j++]=num[i+k][0];
                a[j++]=num[i+k][1];
                a[j++]=num[i+k][2];
            }
            if (judge(a)) return false;
            j=0;
            for(k=0;k<3;k++){
                a[j++]=num[i+k][3];
                a[j++]=num[i+k][4];
                a[j++]=num[i+k][5];
            }
            if (judge(a)) return false;
            j=0;
            for(k=0;k<3;k++){
                a[j++]=num[i+k][6];
                a[j++]=num[i+k][7];
                a[j++]=num[i+k][8];
            }
            if (judge(a)) return false;
        }
    }
    return true;
}
int main(){
    int n;
    Sudoku A;
    cin>>n;
    while (n--){
        A.in();
        if (A.checkAnswer())
            cout<<"Yeah!"<        else cout<<"Oh,No!"<    }
    return 0;
}