POJ1753(未完待续)

来源:互联网 发布:sla编程招聘 编辑:程序博客网 时间:2024/06/09 14:27

我开始就是暴搜然后TLE了。后来看了DISCUSS说逆搜能秒过。然后就换了一下。结果94MS过。当然这是钻了数据的漏洞,还会再写一遍这道题。先把我龌龊的代码贴上来。明天网预,虽然与我的关系不大,但是还是加油的打好吧。。。

上代码:

#include<cstdio>
#include<cstring>
using namespace std;
int a[11][11],b[11][11][11],flag;
char s[10];
void fin(int i,int j){
int k,s,t,n,m;
for(k=1;k<=9;k++){
b[i][k][a[i][j]]=1;
b[k][j][a[i][j]]=1;
}
n=(i-1)/3;
m=(j-1)/3;
for(s=1;s<=3;s++){
for(t=1;t<=3;t++){
b[s+n*3][t+m*3][a[i][j]]=1;
}
}
}
void fout(int s[11][11][11],int t[11][11][11]){
int k,i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
for(k=1;k<=9;k++){
s[i][j][k]=t[i][j][k];
}
}
}
}
void dfs(int i,int j){
int k,c[11][11][11];
if(i==0){
flag=1;
return;
}
if(j==0){
dfs(i-1,9);
}
else{
if(a[i][j]==0){
for(k=1;k<=9;k++){
if(b[i][j][k]==0){
//if(i==4 && j==5)
//printf("%d %d %d\n",i,j,k);
a[i][j]=k;
//printf("ww\n");
fout(c,b);
fin(i,j);
dfs(i,j-1);
if(flag==1){
return;
}
else{
fout(b,c);
a[i][j]=0;
}
}

}
return;
}
else{
dfs(i,j-1);
}


}


}
main(){
int t,i,j,n,m,k;
scanf("%d",&t);
while(t--){
memset(b,0,sizeof(b));
for(i=1;i<=9;i++){
scanf("%s",s);
for(j=1;j<=9;j++)
a[i][j]=s[j-1]-'0';
}
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
if(a[i][j]!=0){
fin(i,j);
}
}
}
flag=0;
//printf("wa\n");
dfs(9,9);
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
}

原创粉丝点击