POJ - 2676 暴搜 注意实现细节
经典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; }