数独

数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

#include<bits/stdc++.h>
using namespace std;
bool isSudo = false;
int num[9][9];
int tol = 0;
void input()
	{
		for(int i = 0; i < 9; ++i){
			for(int j = 0; j < 9; ++j){
				scanf("%d",&num[i][j]);
			}
		}
	}

void output(int a[][9])
	{
		for(int i = 0; i < 9; ++i){
			for(int j = 0; j < 9; ++j){
				printf("%d ",num[i][j]);
			}
			printf("\n");
		}
		printf("------------------------------\n");
	}
bool check(int n, int key)
	{
		int x = n/9;
		int y = n%9;
		for(int j = 0; j <9; ++j){//检查同行
			if(num[x][j] == key)
				return false;
		}
		for(int i = 0; i < 9; ++i){//检查同列
			if(num[i][y] == key)
				return false;
		}
		int subx = n/9/3*3;//所在宫的其实位置
		int suby = n%9/3*3;
		for(int i = subx; i < subx+3; ++i){
			for(int j = suby; j < suby+3; ++j){
				if(num[i][j] == key)
					return false;
			}
		}
		return true;	
	} 
	
void dfs(int n)
	{
		if(n > 80){
			++tol;
			output(num);
			return;
		}
		if(num[n/9][n%9] != 0){ //此位置已经放了数 直接跳过
			dfs(n+1);
		}
		else{
			for(int i = 1; i <= 9; ++i){
				if(check(n,i)){
					num[n/9][n%9] = i;
					dfs(n+1);
					num[n/9][n%9] = 0;
				}
			}
		}
	}	
int main()
	{
		input();
		dfs(0);
		printf("\n");
		printf("total : %d",tol);
		return 0;
	}

猜你喜欢

转载自blog.csdn.net/Tianweidadada/article/details/80369893
今日推荐