一个数独算法,以及对于这段代码的我之见解。

一直都有人劝我开一个博客,然后这段代码就成为了契机。

因为这段代码简直是对于观赏者的一种折磨。。。。我直接复制粘贴如下

#include<iostream.h>
#include<stdlib.h>
#include<time.h> 
int map[9][9];	//数独地图
int I[9][9];	//记录第i行出现的1-9
int J[9][9];	//记录第j列出现的1-9
int B[9][9];	/*第i个九宫出现的1-9	0 1 2
										3 4 5
										6 7 8*/
int n;			//记录迭代次数
bool newsudu(int x);		//x 开始的位置,距离0的位置
void clearrandom(int* r);
int newrandom(int* r);
void coutsudu(void);
void main()
{
	srand((unsigned)time(0));
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			map[i][j]=0;
			I[i][j]=0;
			J[i][j]=0;
			B[i][j]=0;
		}
	}
	n=0;

	newsudu(0);
	coutsudu();
	cout<<n<<endl;
}
bool newsudu(int x)	//x 开始的位置,距离0的位置
{
	if(x==81)
	{
		return true;
	}
	int r[9];		//用来随即生成1-9,且不能重复
	clearrandom(r);
	//开始往map[i][j]插数据
	do 
	{
		int num=newrandom(r);
		if(num==0)	//不行了
		{
			cout<<x<<endl;
			return false;
		}
		if(I[x/9][num-1]==0 && J[x%9][num-1]==0 && B[((x/9)/3)*3+(x%9/3)][num-1]==0)	
		{
			I[x/9][num-1]=1; 
			J[x%9][num-1]=1;
			B[((x/9)/3)*3+(x%9/3)][num-1]=1;
			map[x/9][x%9]=num;
			n++;
			coutsudu();
			if(newsudu(x+1)==true)
			{
				return true;
			}
			map[x/9][x%9]=0;
			I[x/9][num-1]=0; 
			J[x%9][num-1]=0;
			B[((x/9)/3)*3+(x%9/3)][num-1]=0;
		}
	}
	while(1);
}
void coutsudu(void)
{
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			cout<<map[i][j]<<"  ";
		}
		cout<<endl;
	}
	cout<<"---------------------------------"<<endl;
}
void clearrandom(int* r)
{
	for(int i=0;i<9;i++)
	{
		r[i]=0;
	}
}
int newrandom(int* r)	//1-9
{
	int num;
	do 
	{
		num=rand()%9;
		if(r[num]==0)
		{
			r[num]=1;
			return num+1;
		}
		else
		{
			for(int i=0;i<9;i++)
			{
				if(r[i]==0)
				{
					r[i]=1;
					return i+1;
				}
			}
			return 0;
		}
	}
	while(1);
}
这段代码足以称为噩梦。首先为什么不建立一个对象,我们甚至可以叫他Object,因为这个项目整个加在一起只需要一个对象。根据我的构思,这个对象所需要的变量有本身键值key_Assignment,本身位置变量point_X和point_Y。他的本身方法有int rand(),void judgment()这两个。所有对象保存在队列中,整个队列可以定义为对象,但这样一来比起C++更像一个JAVA程序,所以我还是认为整个队列保持一个数 组然后通过POP 和PUSH来实现进队列出队列比较好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用模拟退火算法解决数独问题的 Python 代码示例: ```python import random import math # 定义数独问题 sudoku = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0] ] # 随机生成数独初始状态 for i in range(9): for j in range(9): if random.randint(0, 1): sudoku[i][j] = random.randint(1, 9) # 计算数独的初始解的适应度 def calc_fitness(sudoku): fitness = 0 for i in range(9): for j in range(9): # 计算行、列、九宫格内的重复数字数量 row_count = sum([sudoku[i][k] == sudoku[i][j] for k in range(9) if k != j]) col_count = sum([sudoku[k][j] == sudoku[i][j] for k in range(9) if k != i]) box_count = sum([ sudoku[m][n] == sudoku[i][j] for m in range(i//3*3, i//3*3+3) for n in range(j//3*3, j//3*3+3) if m != i or n != j ]) # 将重复数字数量作为适应度 fitness += row_count + col_count + box_count return fitness # 模拟退火算法求解数独问题 def simulated_annealing(sudoku): T = 1.0 # 初始温度 T_min = 0.01 # 最小温度 alpha = 0.99 # 降温系数 while T > T_min: for i in range(100): # 随机选择一个位置 row = random.randint(0, 8) col = random.randint(0, 8) # 保存当前位置的值 old_value = sudoku[row][col] # 随机生成一个新值 new_value = random.randint(1, 9) while new_value == old_value: # 新值与旧值相同时重新生成 new_value = random.randint(1, 9) # 将新值赋给当前位置,并计算适应度差 sudoku[row][col] = new_value delta = calc_fitness(sudoku) - calc_fitness(sudoku) # 如果新解更优,接受新解 if delta < 0: old_value = new_value # 否则以一定概率接受新解 else: p = math.exp(-delta / T) if random.random() < p: old_value = new_value else: sudoku[row][col] = old_value # 恢复当前位置的值 T *= alpha # 降温 return sudoku # 输出结果 result = simulated_annealing(sudoku) print(result) ``` 该代码使用随机生成的数独问题作为初始状态,通过模拟退火算法搜索最优解。其中,`calc_fitness` 函数计算数独解的适应度,`simulated_annealing` 函数实现模拟退火算法,最终输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值