您的位置:首页 > 其它

HDU5547

2016-05-18 15:01 239 查看
Problem: Sudoku

Source: The 2015 China Collegiate Programming Contest

Description: 解一个4*4的数独。

Solution: 暴力搜索就好,注意这道题的Hash判重的方法。

Code(C++):

#include <stdio.h>
#include <string.h>

const int M=4+2;
const int E=4;

bool used_r[M][M],used_c[M][M],used_g[M][M][M];

int map[M][M];

bool flag;

void dfs(int x,int y)
{
if(x==E+1&&y==1){
flag=true;
return ;
}

if(flag)
return ;

int X,Y;
if(y+1<=E)
X=x,Y=y+1;
else
X=x+1,Y=1;

if(map[x][y])
dfs(X,Y);
else
for(int i=1;i<=E;i++)
if(!used_r[x][i]&&!used_c[y][i]&&!used_g[(x-1)/2][(y-1)/2][i]){
used_r[x][i]=true;
used_c[y][i]=true;
used_g[(x-1)/2][(y-1)/2][i]=true;
map[x][y]=i;
dfs(X,Y);
if(flag)
return ;
used_r[x][i]=false;
used_c[y][i]=false;
used_g[(x-1)/2][(y-1)/2][i]=false;
map[x][y]=0;
}
}

int main()
{
int K=1,N;
for(scanf("%d",&N);N--;){

memset(map,0,sizeof(map));
memset(used_r,false,sizeof(used_r));
memset(used_c,false,sizeof(used_c));
memset(used_g,false,sizeof(used_g));

char str[M];
for(int i=1;i<=E;i++){
scanf("%s",str);
for(int j=1;j<=E;j++){
map[i][j]=str[j-1]=='*'? 0:str[j-1]-'0';
used_r[i][map[i][j]]=true;
used_c[j][map[i][j]]=true;
used_g[(i-1)/2][(j-1)/2][map[i][j]]=tr
bbed
ue;
}
}

flag=false;
dfs(1,1);

printf("Case #%d:\n",K++);
for(int i=1;i<=E;i++){
for(int j=1;j<=E;j++)
printf("%d",map[i][j]);
puts("");
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: