数独c++(递归,回溯)
Sudoku-Java
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1?tpId=37&&tqId=21267&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking
#include<iostream> #include<set> using namespace std; int flag=0;//是否到了最后一个点 void func(int *a,int i=0,int j=0) {//三个参数为 数组、当前位置坐标 if(i>=9||j>=9)//整个数组遍历完,就代表成功了 { //但是之后循环还在继续,所以需要一个标记 flag=1; return; } if(*(a+9*i+j)==0)//如果当前数为零 { set<int> s;//储存当前数不能使用的数 for(int m=i/3*3;m<i/3*3+3;m++)//找出3*3方格中出现的数 { for(int n=j/3*3;n<j/3*3+3;n++) { s.insert(*(a+9*m+n)); } } for(int m=0,n=0;m<9,n<9;m++,n++)//找出行列中出现的数 { s.insert(*(a+9*i+m)); s.insert(*(a+9*n+j)); } for(int m=1;m<10;m++)//从1到9,依次试着放进数组中 { //如果数组没有遍历完 且没有找到m,说明m可用 if(flag==0&&s.find(m)==s.end()) { *(a+9*i+j)=m;//赋值 func(a,i+j/8,(j+1)%9);//递归到下一个点 } } if(flag==0)//如果运行到这里说明前面试错了或者遍历完了整个数组 { //用flag排除后一种可能,试错了则会回溯 *(a+9*i+j)=0;//j将当前值重新赋值为零 return; } } else func(a,i+j/8,(j+1)%9);//如果当前点不为零,直接到下一个点 } int main() { int a[9][9]; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cin>>a[i][j]; } } func((int*)a,0,0); for(int i=0;i<9;i++) { for(int j=0;j<8;j++) { cout<<a[i][j]<<' '; } cout<<a[i][8]<<endl; } }