`

sudoku algorithm

    博客分类:
  • java
 
阅读更多

闲来无事,想弄个数独的生成器出来。最顺手的是java。于是写了个类,给大家分享。目前它的问题是,算出-1后,重新产生一行时,随机处理不够优化,测试时,曾经死过几次。有空优化下。

import java.util.ArrayList;
import java.util.Random;

public class Sudoku {

	public static void main(String[] args) {
		int[][] result = buildAll();
		printAll(result);
	}

	private static void printAll(int[][] result) {
		for (int x = 0; x < 9; x++) {
			for (int y = 0; y < 9; y++) {
				System.out.print(result[x][y] + " ");
			}
			System.out.println();
		}
	}

	private static int[][] buildAll() {
		int[][] result = new int[9][9];

		ArrayList<ArrayList<Integer>> rows = new ArrayList<ArrayList<Integer>>(9);
		ArrayList<ArrayList<ArrayList<Integer>>> nines = new ArrayList<ArrayList<ArrayList<Integer>>>(3);

		for (int n = 0; n < 9; n++) {
			ArrayList<Integer> row = new ArrayList<Integer>(9);
			rows.add(row);
		}

		for (int n = 0; n < 3; n++) {
			ArrayList<ArrayList<Integer>> nine = new ArrayList<ArrayList<Integer>>(3);
			for (int m = 0; m < 3; m++) {
				ArrayList<Integer> number = new ArrayList<Integer>(9);
				nine.add(number);
			}
			nines.add(nine);
		}

		for (int x = 0; x < 9; x++) {
			ArrayList<Integer> row = rows.get(x);
			ArrayList<ArrayList<Integer>> nine1 = nines.get(x / 3);

			for (int y = 0; y < 9; y++) {
				ArrayList<Integer> seeds = new ArrayList<Integer>();
				for (int i = 1; i < 10; i++) {
					seeds.add(i);
				}

				ArrayList<Integer> nine2 = nine1.get(y / 3);

				ArrayList<Integer> cols = new ArrayList<Integer>();
				for (ArrayList<Integer> row1 : rows) {
					if (row1.size() > y)
						cols.add(row1.get(y));
				}
				
				int current = find(seeds, row, cols, nine2);
				
				if(current==-1){
					printAll(result);
					x--;
					break;
				}
					
				row.add(current);
				nine2.add(current);
				result[x][y] = current;
			}
		}
		return result;
	}

	private static int find(ArrayList<Integer> seeds, ArrayList<Integer> row, ArrayList<Integer> cols, ArrayList<Integer> nine) {
		seeds.removeAll(row);
		seeds.removeAll(cols);
		seeds.removeAll(nine);

		Random random = new Random();
		int n = seeds.size();
		if (n > 0) {
			int index = random.nextInt(n);
			return seeds.get(index);
		} else {
			return -1;
		}
	}
}
 
分享到:
评论

相关推荐

    Algorithm-Sudoku-Generator.zip

    在本案例中,"Algorithm-Sudoku-Generator.zip"是一个压缩包,其中包含了一个C语言编写的数独生成器,它使用了改进的高效回溯算法来生成合法的数独谜题。 回溯法是一种试探性的解决问题的方法,当遇到死路时,会...

    leetcode答案-SudokuGame:一个由JavaFX框架构建的数独游戏

    leetcode 答案 Sudoku ref: UserInterface IUserInterfaceContract:前端与后端的交互接口 EventListener:处理每次输入时的接口 View:更新前端以及消息提示的接口 SudokuTextField:继承了JavaFX中的...Algorithm

    Algorithm-Sudoku-Solver.zip

    在本文中,我们将深入探讨一个基于C语言实现的数独解算器项目——"Algorithm-Sudoku-Solver.zip"。这个项目不仅能够解决数独谜题,还能验证已填好的数独是否正确,并生成新的数独题目,充分展现了算法在解决复杂问题...

    A Pencil-and-Paper Algorithm for Solving Sudoku Puzzles

    数独游戏已经成为全球许多人消遣的爱好,尤其在近年来受到了极大的欢迎。数独之所以风靡,有其独特的魅力。首先,数独作为一个智力游戏,对解题者来说既有一定的难度,又不是难以逾越。其次,通过仔细观察和逐行逐列...

    The Algorithm Design Manual (2rd Edition)

    7.3 Sudoku 7.4 War Story: Covering Chessboards 7.5 Heuristic SearchMethods 7.6 War Story: Only it is Not a Radio 7.7 War Story: Annealing Arrays 7.8 Other Heuristic SearchMethods 7.9 Parallel ...

    sudoku:一个非常快速的Java Sudoku库实现以及一个命令行客户端

    Sudoku Java库 Java快速实现算法的实现。 还具有解决数独谜题的功能。 建立它 为了构建应用程序,您需要Apache Maven。 使用以下命令行: $ mvn clean package 特征 在下面的列表中,我要概述这些功能: 性能:...

    ice_sudoku.github.io:专业数独程序 iOSWindowsmacOSUbuntu

    using advanced multithreading random algorithm 支持按照逻辑分步求解绝大多数数独 solving a sudoku step by step logically 支持macOS设备和iOS设备通过蓝牙连接组成多进程多线程运算组,齐心协力完成一个数独的...

    Skiena-The_Algorithm_Design_Manual.pdf

    7.3 Sudoku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 7.4 War Story: Covering Chessboards . . . . . . . . . . . . . . . . . . 244 7.5 Heuristic SearchMethods . . . . . . . ....

    Sudoku-Generator:使用改进的高效回溯算法用C ++编写的Sudoku拼图生成器

    《Sudoku拼图生成器:基于改进的高效回溯算法的C++实现》 Sudoku是一种广受欢迎的逻辑解谜游戏,它通过填充一个9x9的网格来满足特定的规则,使得每行、每列以及每个3x3的小宫格内都包含1到9的数字,且每个数字在...

    sudoku.js:数独解算器中的Javascript

    sudoku.js用于解决Sudokus的免费网站模板。 动画功能二维码功能复制到网址功能从url读取,以便您可以参考特定的数独板 (数独只是添加到URL的哈希(#)9x9数字中,其中0表示尚未填充字段) 我的算法部分的实现在...

    SudokuSolver:用Knuth的Algorithm X(Java)解决数独的程序

    使用Knuth的Algorithm X(Java)解决数独的程序单击此处获取原始程序日语注释已添加到原始程序中。 由于它是MIT许可证,因此在下面列出了全文。 麻省理工学院 MIT许可证(MIT) 版权所有(c)2014 Rafal Szymanski ...

    Sudoku:数独解算器和拼图生成器

    特征: Sudoku solving using the Depth-First Search algorithm. Sudoku generation to create completed Sudoku puzzles.我学到的是: Using pre-calculated values to deal with awkward constraints (unique #s...

    sudoku_solver:使用Donald Knuth的Algorithm X解决数独功能。巴斯大学的人工智能课程-获奖率100%

    最终成绩:100/100用法要获得解决方案, sudoku_solver numpy.ndarray((9,9), ...)传递给numpy.ndarray((9,9), ...) 。 输入示例可以在/data找到。 import numpy as npsudoku_state = np . ndarray (( 9 , 9 )

    sudoku-solver:使用DLX算法的快速数独难题求解器:puzzle_piece:

    DLX算法是由日本数学家和程序员Hakuo Okada发明的,它是基于一种称为"Exact Cover"问题的解决方法,也被称作Algorithm X。 首先,让我们深入了解数独。数独是一种逻辑游戏,玩家需要在9x9的格子中填入数字1到9,...

    sudoku:在 Clojure 中解决数独谜题

    sudoku-joc The brute force algorithm from Michael Fogus, Chris Houser: The Joy of Clojure Second Edition 数独一种或多或少天真的蛮力算法 数独-cl core.logic 中的数独求解器,改编自 在我的 github 帐户上...

    sudoku-solver:使用约束传播的Sudoku求解器(本科项目)

    在本项目中,约束传播可能采用了两种主要策略:AC-3算法(Arc-Consistency Algorithm)和Backtracking(回溯法)。 AC-3算法是确保每个变量的赋值与其邻居的约束一致的方法。它通过检查每一条边(变量之间的关系)...

    Dancing Links Sudoku-开源

    项目中的"DancingLinksSudoku.jar"是实现该算法的Java程序,用户可以通过运行批处理文件"sudoku.bat"或Unix脚本"sudoku.sh"来启动。这些文件提供了一个交互式的界面,用户可以选择生成新的数独谜题或者解决已有的...

    sudoku:生成数独,求解算法和穷举搜索的启发式算法

    数独 生成数独,用于求解算法和穷举搜索的启发式算法。 该应用程序允许您在数独集合上测试算法的运行时间。 演示 实现的算法 生成数独 this . generate = function ( ... this .... this .... this .... this .... this

    Sudoku-Solver:d通过使用回溯算法可视化数独板,使用Python和PyGame库实现的数独解算器

    当您可以编写脚本来解决Ya问题时,为什么还要手动解决Sudoku问题呢? 介绍: 数独是最流行的基于逻辑的数字放置益智游戏之一。 日语中“ Su-doku”的字面意思是“单个数字”。 目的是用数字填充一个九乘九(9x9)...

    Sudoku-Solver:基于 PHP 的数独解谜

    解决数独谜题的课程 使用: 只需将二维数组放入solve_it方法中 调用getResult方法查看结果 例子: $ arr = array ( array ( 0 , 6 , 0 , 0 , 0 , 0 , 0 , 3 , 0 ), array ( 0 , 0 , 0 , 5 , 0 , 0 , 0 , 0 , 4 ),...

Global site tag (gtag.js) - Google Analytics