004-数独问题

题目:

数独问题:9*9的矩阵,要求每一行,每一列,每个九宫格都是1-9这九个数字且不能重复。

给定一9*9矩阵,里面有部分数空缺,要求找出满足上述要求的一个矩阵。

 代码:代码中的二维数组用来存放数独中的数字,没有数字的位置为0。

#include<stdio.h>
#define N 9

int ar[N][N]={8,0,0,0,0,0,0,0,0,
0,0,3,6,0,0,0,0,0,
0,7,0,0,9,0,2,0,0,
0,5,0,0,0,7,0,0,0,
0,0,0,0,4,5,7,0,0,
0,0,0,1,0,0,0,3,0,
0,0,1,0,0,0,0,6,8,
0,0,8,5,0,0,0,1,0,
0,9,0,0,0,0,4,0,0
};

bool ok(int t){
	int a=t/9;
	int b=t%9;
	int newx=a/3*3;
    int newy=b/3*3;
	for(int i=newx;i<newx+3;i++){
        for(int j=newy;j<newy+3;j++){
			if(i!=a && ar[i][j]==ar[a][b] && j!=b)
				return false;
		}
	}
	for(i=0;i<N;i++)
		if(i!=b && ar[a][i]==ar[a][b])
			return false;
	for(i=0;i<N;i++)
		if(i!=a && ar[i][b]==ar[a][b])
			return false;
	return true;
}

void traceback(int t){
	if(t==81){
		for(int i=0;i<N;i++){
            for(int j=0;j<N;j++)
                printf("%d ",ar[i][j]);
			printf("\n");
		}
		return;
	}
	int a=t/9;
	int b=t%9;
	if(ar[a][b]==0){
		for(int i=1;i<10;i++){
			ar[a][b]=i;
			if(ok(t)==1)
				traceback(t+1);
			ar[a][b]=0;
		}
	}
	else
		traceback(t+1);
}

int main()
{
	traceback(0);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章