数独计算

#include
#define N 9
#define N_BOX 3

int mat[N][N] = {0};

int mat_set[N][N] = {0};

int Judge(int x, int y)
{
//Line & Cols
//if(0)
{
int i;
int s = mat[y][x];
for(i=0;i
{
if( (i!=x && s==mat[y][i]) 
||   (i!=y && s==mat[i][x]) )
{
//printf("y=%d,x=%d\n",y,x);
return 0;
}
}
}
//Box 
//if(0)
{
int x_start = x / N_BOX * N_BOX;
int x_stop = x_start N_BOX;
int y_start = y / N_BOX * N_BOX;
int y_stop = y_start N_BOX;
int ix,iy;
for(iy=y_start; iy
{
for(ix=x_start; ix
{
//printf("ix=%d,iy=%d\n",ix,iy);
if(   (ix!=x && iy!=y) 
&&   mat[iy][ix]==mat[y][x] 
)
{
return 0;
}
}
}
}
return 1;
}

int Input()
{
int ix,iy;
for(iy=0;iy
{
for(ix=0;ix
{
int s;
fscanf(stdin,"%d",&s);
mat[iy][ix] = mat_set[iy][ix] = s;
}
}
return 0;
}

int Output()
{
int ix,iy;
for(iy=0;iy
{
for(ix=0;ix
{
printf("%d ",mat[iy][ix]);
}
printf("\n");
}
return 0;
}

int Check()
{
int i=0;
while(0<=i && i
{
//printf("%d\n",i);
if(mat_set[i/N][i%N]!=0)//Is Set
{
i;
continue;
}
for( mat[i/N][i%N];mat[i/N][i%N]<=N; mat[i/N][i%N])
{
if(Judge(i%N,i/N))
{
break;
}
}
if(mat[i/N][i%N]>N) //Not Found
{
mat[i/N][i%N] = 0;
--i;
while(0<=i && mat_set[i/N][i%N]!=0)--i;
}
else
{
i;
}
}
if(i==N*N)
return 1;
return 0;
}

int main()
{
Input();
if(Check())
{
Output();
}
else
{
printf("Not Found\n");
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值