题解
2026-04-12 18:00:22
发布于:江苏
1阅读
0回复
0点赞
深搜枚举每个空格子(x,y)可能填入的数字i(1~9),判断当前空格子的第x行,第y列,以及所处3*3的大方格中是否含有数字i,如果没有则继续枚举下个空格子,直到枚举完所有空格子。
#include<bits/stdc++.h>
using namespace std;
bool se[10][10],row[10][10],col[10][10];
int cnt,mp[10][10];
pair<int,int> a[105];
int num[105];
bool dfs(int k){
if( k==cnt ) {
return true;
}
for(int i=1;i<=9;i++){
int x = a[k].first , y = a[k].second ;
if( row[x][i] || col[y][i] || se[x/3*3+y/3][i] ) continue;
num[k] = i;
row[x][i] = col[y][i] = se[x/3*3+y/3][i] = 1;
if( dfs(k+1) ) return true;
row[x][i] = col[y][i] = se[x/3*3+y/3][i] = 0;
}
return false;
}
int main(){
int c;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cin>>c;
mp[i][j] = c;
if( c!=0 ){
row[i][c] = 1;
col[j][c] = 1 ;
se[ i/3*3 + j/3 ][c] = 1;
}
else{
a[cnt++] = make_pair(i,j);
}
}
}
dfs(0);
for(int i=0;i<cnt;i++){
int x = a[i].first , y = a[i].second ;
mp[x][y] = num[i];
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout <<mp[i][j]<<' ';
}
cout << endl;
}
return 0;
}
这里空空如也






有帮助,赞一个