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;
} 
posted @ 2018-02-12 01:59  Caturra  阅读(164)  评论(0)    收藏  举报