⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 createdata.cpp

📁 CreateData.cpp 文件是产生9x9矩形的数字算法 ShuDu.java 文件只是为了更好的理解数独一个文件
💻 CPP
字号:
//CreateData.cpp 生成数独矩阵的算法
//调用原型
//void CreateShuDuMetrix(int DataBuffer[9][9]);
//
//code is from csdn

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include "CreateData.h"


int Fill_Pos(SHUDUMETRIX dest, LINETYPE nums_possible, int line, int pos)
{
	if ( pos >= 9 )
	{
		return Fill_Line(dest, line + 1);
	}
	if ( dest[pos][line] != 0 ) return Fill_Pos(dest, nums_possible, line, pos + 1);
	for ( int i = 0; i < 9; i++ )
	{
		if ( !nums_possible[i] ) continue;
		/* 检查本列是否重复 */
		int vetical_failed = 0;
		for ( int j = 0; j < 9; j++ ) 
		{
			if ( dest[pos][j] == i + 1 )
			{
				vetical_failed = 1;
				break;
			}
		}
		if ( vetical_failed ) continue; 

		/* 检查九宫格是否重复 */
		int nine_failed = 0;
		int m = pos / 3;
		int n = line / 3;
		m *= 3;
		n *= 3;
		for ( int y = n; y < n + 3; y++ )
		{
			for ( int x = m; x < m + 3; x++ )
			{
				if ( dest[x][y] == i + 1 ) 
				{
					nine_failed = 1;
					break;
				}
			}
			if ( nine_failed ) break;
		}
		if ( nine_failed ) continue;
		
		/* all ok, try next position */
		dest[pos][line] = i + 1;
		nums_possible[i] = 0;
		if (Fill_Pos(dest, nums_possible, line, pos + 1) ) 
		{
			/* 本行已全部OK,尝试下一行 */
			if ( Fill_Line(dest, line + 1) ) return 1;
			/* 下一行失败,重新尝试本位置的剩余可能性 */
		}
		nums_possible[i] = 1;
		dest[pos][line] = 0;
	}
	return 0;
}

/* 填下一行 */
int Fill_Line(SHUDUMETRIX dest, int line)
{
	if ( line >= 9 )
	{
		return 1;
	}
	LINETYPE nums;
	LINETYPE saveline;
	/* calc possibility(for the current line) */
	for ( int i = 0; i < 9; i++ ) nums[i] = 1; /* all can be */
	for ( i = 0; i < 9; i++ )
	{
		int n = dest[i][line];
		/* save line */
		saveline[i] = dest[i][line];
		if ( n != 0 ) nums[n - 1] = 0; /* appears */
	}
	if ( !Fill_Pos(dest, nums, line, 0) )
	{
		/* restore line */
		for (  i = 0; i < 9; i++ ) dest[i][line] = saveline[i];
		return 0;
	}
	return 1;
}

void CreateShuDuMetrix(SHUDUMETRIX dest)
{
	memset(dest, 0, sizeof(SHUDUMETRIX));
	srand( GetTickCount() );

	/* 随机填充第一行 */
	int numbers[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	//随机交换
	for ( int i = 0; i < 100; i++ )
	{
		int p1 = rand() % 9;
		int p2 = rand() % 9;
		int data = numbers[p1];
		numbers[p1] = numbers[p2];
		numbers[p2] = data;
	}
	for ( i = 0; i < 9; i++ ) dest[i][0] = numbers[i];

	//继续填充下一行
	Fill_Line(dest, 1);
	
	return ;
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -