经典sudoku问题
按部就班就好
一定要注意细节
大于1还是大于等于1
r c越界判断
judge时0的特判
blabla居然磨了2个小时
改了很多地方所以实现得有点冗余,反正能A吧
/*H E A D*/
int sudo[66][66];
char str[666];
int usedr[66][11];
int usedc[66][11];
int rsum[66],csum[66];
typedef pair<int,int> P;
P pos(int i,int j){
if(i>=1&&i<=3){
if(j>=1&&j<=3) return P(1,1);
if(j>=4&&j<=6) return P(1,4);
if(j>=7&&j<=9) return P(1,7);
}
if(i>=4&&i<=6){
if(j>=1&&j<=3) return P(4,1);
if(j>=4&&j<=6) return P(4,4);
if(j>=7&&j<=9) return P(4,7);
}
if(i>=7&&i<=9){
if(j>=1&&j<=3) return P(7,1);
if(j>=4&&j<=6) return P(7,4);
if(j>=7&&j<=9) return P(7,7);
}
}
int check2;
bool cal2(int nowr,int nowc,int num){
int sum=0;
if(rsum[nowr]+num>45||csum[nowc]+num>45)return 0;
P p=pos(nowr,nowc);
int sr=p.first,sc=p.second;
check2=0;
rep(i,1,9) if(sudo[nowr][i]==num){
++check2;
if(check2>=1)return 0;
}
check2=0;
rep(i,1,9) if(sudo[i][nowc]==num){
++check2;
if(check2>=1)return 0;
}
check2=0;
rep(i,sr,sr+2){
rep(j,sc,sc+2){
if(sudo[i][j]==num){
++check2;
if(check2>=1)return 0;
}
}
}
return 1;
}
int cnt=0;
bool dfs(int r,int c){
if(r==9&&c==10)return 1;
else if(c==10){
c=1;
r++;
if(r==10)return 1;
}
while(sudo[r][c]){
c++;
if(c==10){
c=1;
r++;
if(r==10)return 1;
}
}
rep(i,1,9){
if(usedr[r][i]||usedc[c][i]||cal2(r,c,i)==0){
continue;
}
if(!cal2(r,c,i))continue;
usedr[r][i]++;usedc[c][i]++;
rsum[r]+=i;csum[c]+=i;
sudo[r][c]=i;
if(dfs(r,c+1))return 1;
else{
usedr[r][i]--;usedc[c][i]--;
rsum[r]-=i;csum[c]-=i;
sudo[r][c]=0;
}
}
return 0;
}
int main(){
int T=read();
while(T--){
memset(usedr,0,sizeof usedr);
memset(usedc,0,sizeof usedc);
memset(rsum,0,sizeof rsum);
memset(csum,0,sizeof csum);
rep(i,1,9){
s1(str);
rep(j,1,9) sudo[i][j]=str[j]-‘0‘;
}
bool flag=0;
rep(i,1,9){
rep(j,1,9){
if(!sudo[i][j])continue;
if(++usedr[i][sudo[i][j]]>1){
flag=1;
}
if(++usedc[j][sudo[i][j]]>1){
flag=1;
}
rsum[i]+=sudo[i][j];
csum[j]+=sudo[i][j];
}
}
dfs(1,1);
rep(i,1,9){
rep(j,1,9){
print(sudo[i][j]);
}
enter;
}
}
return 0;
}