C语言检测数独是否合法,判断数独是否正确 - BetaYuan的个人空间 - OSCHINA - 中文开源技术交流社区...

#include

#include

#include

#define USE_FILE 0

int ReadData(int** mat)

{

int i,n=-1;int *p;FILE* fp;

if(NULL!=(fp=fopen("dataIN.txt","r")))

{

fscanf(fp,"%d",&n);

(*mat)=(int*)malloc(n*n*n*n*sizeof(int));

p=(*mat);

for(i=0;i

fscanf(fp,"%d",p++);

fclose(fp);

}

return n;

}

int GetElem_1(int* mat,int n,int group,int index)

{

return *(mat+group*n*n+index);

}

int GetElem_2(int* mat,int n,int group,int index)

{

return *(mat+index*n*n+group);

}

int GetElem_3(int* mat,int n,int group,int index)

{

int row,col;

row=(group/n)*n+index/n;

col=(group%n)*n+index%n;

return *(mat+row*n*n+col);

}

int Compare(int* mat,int n,int (*GetElem)(int*,int,int,int))

{

int i,j,k,err=0;

for(k=0;k

for(i=0;i

for(j=i+1;j

if(GetElem(mat,n,k,i)==GetElem(mat,n,k,j))

{

err++;break;

}

return err;

}

int main(int argc, char *argv[])

{

int *mat;

int n,err=0;

#if USE_FILE

n=ReadData(&mat);

#else

int mat_raw[4][4]={{1,2,3,4},

{5, 6, 7, 8},

{9, 10, 11, 12},

{13, 11, 15, 16}};

mat=(int*)mat_raw;

n=2;

#endif

err+=Compare(mat,n,GetElem_1);

err+=Compare(mat,n,GetElem_2);

err+=Compare(mat,n,GetElem_3);

err>0?printf("No"):printf("Yes");

return 0;

}

int isValidSudoku(int arr[]) {

vector row(9,0);

vector col(9,0);

vector grid(9,0);

for(int i=0;i<81;i++)

{

int x=i/9,y=i%9;

int n=arr[i];

if ( n<1 || n> 9)

return 0;

if ( row[x]& (1<

return 0;

else

row[x]|=(1<

if ( col[y]& (1<

return 0;

else

col[y]|=(1<

int kgrid=(x/3)*3+y/3;

if ( grid[kgrid]&(1<

return 0;

else

grid[kgrid]|=(1<

}

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值