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;
}