`
yangyi
  • 浏览: 114555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于数独地图的产生

J# 
阅读更多
如何生成一个数独的地图,并且保证是有解的?我能想到的办法就是先产生一个解,然后做减法,产生解的过程可以通过迷宫的回溯方法解决,每个位置有9个选择。
初始化时,可以把前9个位置按照乱序的1-9进行排列,然后顺序求出下面的解。但是这样随机性不怎么好,应该可以指定地图上任何9个不重复的数据,这个是肯定无害的,当回溯的时候,不能改变这些固定数据的值,即在地图上随机产生9个位置。
不过显然这样可以求出解,但性能不高,因为从来没有过滤过重复的比较判定,实际上,每次判定过程中的可以推理出N种可能,但我们只取得了一种,下次又会重复判定。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sudoku {
	private int[][] map = new int[10][10];
	
	public static void main(String[] args){
		Sudoku su = new Sudoku();
		for(int i=0;i<10;i++){
			su.run();
			System.out.println();
		}
	}
	
	public void run(){
		init();
		draw();
		print();
	}
	
	private void init(){
		for(int i=1;i<10;i++){
			for(int j=1;j<10;j++){
				map[i][j] = 0;
			}
		}
		randomInit();
	}
	
	private void print(){
		for(int i=1;i<10;i++){
			for(int j=1;j<10;j++){
				System.out.print(map[i][j] + "\t");
			}
			System.out.println();
		}
	}
	
	private static class Point{
		public Point(int x, int y){
			this.x = x;
			this.y = y;
		}
		int x,y;
	}
	
	public void draw(){
		Point p = new Point(2, 1);
		int s = 1;
		
		while(p != null){
			if(!lay(p.x, p.y, s)){
				p = previous(p.x, p.y);
				s = map[p.x][p.y] + 1;
			}else{
				p = next(p.x, p.y);
				s = 1;
			}
		}
	}

	private void randomInit() {
		List<Integer> startNumbers = new ArrayList<Integer>();
		for(int i=1;i<=9;i++){
			startNumbers.add(i);
		}
		Collections.shuffle(startNumbers);
		for(int i=1;i<=9;i++){
			map[i][1] = startNumbers.get(i - 1);
		}
	}
	
	public boolean lay(int x, int y, int s){
		for(int v=s;v<10;v++){
			map[x][y] = v;
			if(isValid(x, y)){
				return true;
			}
		}
		map[x][y] = 0;
		return false;
	}
	
	private Point next(int x, int y){
		if(x == 9 && y == 9){
			return null;
		}else if(x == 9){
			return new Point(1, y+1);
		}else{
			return new Point(x+1, y);
		}
	}
	
	private Point previous(int x, int y){
		if(x == 1 && y == 1){
			throw new RuntimeException("Nan solution found!");
		}else if(x == 1){
			return new Point(9, y-1);
		}else{
			return new Point(x-1, y);
		}
	}
	
	private boolean isValid(int x, int y){
		for(int i=1;i<10;i++){
			if(i != y && map[x][i] == map[x][y]){
				return false;
			}
			if(i != x && map[i][y] == map[x][y]){
				return false;
			}
		}
		
		int xStart = getZone(x)*3;
		int yStart = getZone(y)*3;
		for(int i=xStart+1;i<=xStart+3;i++){
			for(int j=yStart+1;j<=yStart+3;j++){
				if(map[i][j] == map[x][y] && !(x == i && y == j)){
					return false;
				}
			}
		}
		return true;
	}
	
	private int getZone(int n){
		return (n -1)/3;
	}
}

分享到:
评论
1 楼 albertshaw 2011-04-02  
init()里面
for (int i = 1; i < 10; i++) {
	for (int j = 1; j < 10; j++) {
		map[i][j] = 0;
	}
}


这是在干嘛,删掉吧?
额,我也就能看看这种无关紧要的小问题了...

相关推荐

    数独解法产生程序

    "数独解法产生程序"的目标就是利用计算机算法解决数独问题,给定一个不完整的数独数组,程序将自动填充缺失的数字,生成完整的数独解决方案。 在这个程序中,通常会采用回溯算法或者递归的方式来解决数独问题。下面...

    数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏.rar

    数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏...

    数独代码 数独代码 数独代码

    数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码数独代码...

    不同难度的数独的产生与求解

    数独是一种广受欢迎的逻辑推理游戏,它基于一个9x9的网格,被分为9个3x3的小九宫格。每个小九宫格、每一行、每一列都必须填入1到9的数字,且每个数字在每行、每列和每个小九宫格内只能出现一次,不允许重复。本项目...

    数独编辑器 可玩“杀手数独”喔

    小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。压缩包中附带了若干...

    数独验证器_sudoku验证器_数独验证_数独_

    数独是一种广受欢迎的逻辑游戏,它通过填充一个9×9的网格,使得每一行、每一列以及每一个3×3的小宫格内都包含从1到9的所有数字且每个数字不重复,以此来锻炼玩家的逻辑思维和推理能力。本项目提供了一个数独验证器...

    数独9X9_MATLAB数独_数独9x9在线_9x9数独_数独_求解9X9数独_

    数独是一种广受欢迎的逻辑游戏,它通过填充一个9×9的网格,使得每一行、每一列以及每一个小的3×3宫格内的数字1到9都只出现一次,来达到解谜的目的。MATLAB作为一种强大的数值计算和编程环境,可以用来编写程序解决...

    数独编辑器 源代码

    小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。压缩包中附带了若干...

    数独编辑器 1.001版

    小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。压缩包中附带了若干...

    数独编辑器 1.002版

    小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。压缩包中附带了若干...

    数独算法,数独游戏

    "Thread"可能是关于多线程处理的部分,这可能意味着游戏允许用户在同一时间进行多个数独谜题,或者使用多线程来优化算法的性能,比如通过并行计算加速解题过程。在多线程编程中,需要考虑线程安全,确保数据在并发...

    原创数独填色高效解法

    标题中的“原创数独填色高效解法”指的是在C语言环境下实现的一种创新性的数独求解算法。这种算法被称为“填色法”,是解决数独问题的一种高效策略。填色法的基本思想是通过给数独格子着色来帮助找到唯一解。它通过...

    数独编辑器 黑色星期五版

    小巧的数独编辑器,现在可以编辑标准数独、宫格数独、锯齿数独、超级数独(或者叫窗口数独)、杀手数独、时钟数独、连体数独等,并且数独的尺寸不限定为3x3,比如宫格数独可以编辑3x2及3x4等等的地图尺寸。...

    数独计算器 数独游戏 数独秒算

    数独计算器 数独游戏 数独秒算 本数独游戏 采用分为闯关模式和 随机模式,随机模式中的题库更多,闯关模式会随着 关数的增加而越来越难。2个互不影响。 另外还有个数独计算器,妙算数独。 修复了上次数独计算器的2...

    winform数独C#的数独游戏

    winform数独C#的数独游戏 本程序基于.netframework使用C#语言开发,实现功能: 1、各个难度随机出题(New); 2、数独解题提示(Compute); 3、输入的合法性校验; 思路分享 说一下开发步骤及思路: 1、验证合法性...

    数独终结者 标准数独计算器

    《数独终结者:深入解析标准数独计算器的实现》 数独,作为一种深受人们喜爱的逻辑推理游戏,其挑战性和趣味性并存。而"数独终结者"是一款基于C++编程语言,利用Microsoft Foundation Classes (MFC)库开发的标准...

    杀手数独100题.doc

    杀手数独100题.doc知识点总结 杀手数独(Killer Sudoku)是一种变种的数独游戏,结合了经典数独和 Kakuro 游戏的元素。下面我们将从文件“杀手数独100题.doc”中总结出相关的知识点: 1..killersudoku的游戏规则:...

    数独游戏1.2(可解数独)

    数独游戏1.2(可解数独)是一款基于经典的逻辑推理游戏——数独的软件应用。数独的起源可以追溯到拉丁方阵,一种在数学领域被广泛研究的构造,其基本思想是将不同数字填入一个方形网格中,使得每一行、每一列以及每个...

    labview_数独实现

    在本文中,我们将深入探讨如何使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这一强大的图形化编程环境来实现数独游戏。LabVIEW是由美国国家仪器公司(National Instruments)开发的一款适用...

    数独自动生成题库

    数独是一种广受欢迎的逻辑推理游戏,它源自19世纪末的瑞士,由美国的Howard Garns在1979年发扬光大,并在20世纪90年代末通过日本的《Number Place》杂志传遍全球。数独游戏的目标是在9×9的网格中填入1到9的数字,...

Global site tag (gtag.js) - Google Analytics