- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java版数独游戏核心算法(一)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏.
现在将全部代码分享出来和大家学习交流,当然代码中有着各种各样的问题和不足之处,望各位朋友批评指点.
以下是生成数独地图的核心算法,算法不是很好,也是之前参考过网上的一些思想:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
package
hlc.shudu.src;
/*
* 数独的帮助类,里面提供数据所需的所有算法
*/
public class ShuduHelper {
//数独地图数组
private static int[][] maps = new int[9][9];
//每个小九宫格可放置位置的数
private static int[] canPutSum = new int[9];
//用来存储之前放置过的位置
static int[] used = new int[9];
//是否已经完成地图的生成
static boolean isOk = true;
/*
* 得到数独地图数组
*/
public static int[][] getMap() {
//判断是否已经完成地图的生成,要是没有完成就重新生成。
//从这里就可以看出算法还有待优化,如果回溯的好的话就一直可以通过回溯来重新生成,而这里是通过重新执行生成算法来重新生成。希望感兴趣的朋友可以去实现以下。
do{
isOk = true;
initMaps();
}while(!isOk);
return maps;
}
/*
* 初始化maps
*/
private static void initMaps() {
// 初始化地图数组中没有填入任何数字
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
maps[i][j] = -1;
}
}
// 依次填入1~9
for (int num = 1; num <= 9; num++) {
for (int i = 0; i < 9; i++) {
used[i] = -1;
canPutSum[i] = -1;
}
// 遍历大九宫格中的每个小九宫格
for (int i = 0; i < 9; i++) {
if (canPutSum[i]==-1) {
canPutSum[i] = getCanPutSum(i, num);
}
if (canPutSum[i]==1) {
used[i] = -1;
}
if (canPutSum[i] == 0) {
canPutSum[i] = -1;
used[i] = -1;
// 如果当前小九宫格中不能放入数字num,则回到前一个小九宫格
if (i > 0) {
// 将前一个九宫格中放num的位置清空
if (used[i-1]!=-1) {
//maps[(int) (Math.floor(used[i-1]/3)+Math.floor((i-1)/3)*3)][used[i-1]%3+((i-1)%3)*3]=-1;
clearNum(i - 1, num);
}
// i回退一个,因为等会for循环灰给i加一,所以这里减2
i -= 2;
continue;
} else {
isOk = false;
return;
}
} else {
// 将num放入当前小九宫格中
boolean flag = false;
while (!flag) {
int j = (int) (Math.random() * 9);
// 当前小方格横坐标
int ii = (i / 3) * 3 + j / 3;
// 当前小方格纵坐标
int jj = (i % 3) * 3 + j % 3;
//System.out.println("num:"+num+"\tii:"+ii+"\tjj:"+jj);
// 如果可以放置num则放置
if (maps[ii][jj] == -1 && j!=used[i] && isCanPut(ii, jj, num)) {
maps[ii][jj] = num;
used[i] = j;
canPutSum[i] -= 1;
flag = true;
}
}
}
}
}
}
/*
* 清空第i个小九宫格中的num
*/
private static void clearNum(int i, int num) {
for (int j = 0; j < 9; j++) {
// 当前小方格横坐标
int ii = (i / 3) * 3 + j / 3;
// 当前小方格纵坐标
int jj = (i % 3) * 3 + j % 3;
// 判断当前小方格是否可以放置
if (maps[ii][jj] == num) {
maps[ii][jj] = -1;
}
}
}
/*
* 得到当前小九宫格可以放入数字num的位置数目
*/
private static int getCanPutSum(int i, int num) {
int sum = 0;
// 遍历小九宫格
for (int j = 0; j < 9; j++) {
// 当前小方格横坐标
int ii = (i / 3) * 3 + j / 3;
// 当前小方格纵坐标
int jj = i % 3 * 3 + j % 3;
// 判断当前小方格是否可以放置
if (maps[ii][jj] == -1 && isCanPut(ii, jj, num)) {
++sum;
}
}
return sum;
}
/*
* 指定横纵坐标点是否可以放置num
*/
private
static
boolean
isCanPut(
int
ii,
int
jj,
int
num) {
// 判断指定坐标点的同行或同列是否有相同数字,要是有则为false
for
(
int
i =
0
; i <
9
; i++) {
if
(maps[ii][i] == num) {
return
false
;
}
if
(maps[i][jj] == num) {
return
false
;
}
}
return
true
;
}
}
|
完整程序包可在GitHub上下载:https://github.com/houlongchao/s 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/da_keng/article/details/47778921 。
最后此篇关于java版数独游戏核心算法(一)的文章就讲到这里了,如果你想了解更多关于java版数独游戏核心算法(一)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的填充数独板的代码如下所示: public class SudokuBoard { static int N = 9; static int[][] grid = new int[N
我正在使用“强力”随机方法创建一个数独生成器。我已经能够使用以下代码检查 x/y 轴是否有重复数字: for(l=0; l<9; l++){//Makes all vertical work.
我有一个数独谜题求解器,需要我们使用递归。问题是我检查可用空间的 boolean 值应该通过引用更新当前位置,但事实并非如此。什么会导致这个? public boolean solve() {
我正在尝试为我的项目制作一个数独游戏,但如果我增加数独Grid中的空白空间数量,代码只会抛出异常arrayoutofbounds但是无法弄清楚它来自哪里。 k 是网格中空白空间的数量。 我没有尝试过任
当我尝试编写一个解决数独问题的程序时,我的代码中有一个错误。 我的程序可以运行,但运行效果不佳。它只解决程序中的第一行。 我认为我在那行代码上犯了错误: int ft_rezolva(int **t)
这是我的。该方法应输出该空间中所有可用数字的数组。出于某种原因,这不会过滤掉相同的框/行/列。应该如何正确编码? public int[] getAllowedValues(int row, in
我遇到了一个问题。我是 Java 的新手,正在尝试尝试比以前更复杂的东西。这是我自己的个人文件输入和主要方法与其他方法的一些蚕食源的组合。我对递归仍然很生疏。出于某种原因,更改二维数组“板”中值的分配
嘿,我无法让代码比较给定行或列和 block 的整数,以确保这些参数中没有重复项。我不知道用 3 种不同的方法分离这三个约束是否是一个好主意,或者只是尝试一次完成所有的操作。 public stati
我正在研究 javascript 数独游戏,就输入验证而言,我很困惑。当每个值都输入到数独表中时,我有一个 onkeyup 触发一个函数,我试图用它来确保没有值进入已经存在这样一个值的行/列/框。这是
我正在研究一个小的个人数独游戏并试图扩展它。 到目前为止,我使用递归回溯方法使“求解”部分正常工作,该方法在设法求解递归时返回 true。 现在我正在尝试构建一个独特的解决方案板生成器,并且我在网上找
数独回溯法 int xx = (pos.getX() / 3) * 3; int yy = (pos.getY() / 3) * 3; for (int y =
我是 c++ 的新手,在做作业(数独)时遇到了问题。 说明说:“你必须创建一个新板作为当前板的拷贝(使用复制构造函数并使用 new) 从堆中分配板。” 我试过了(写在board.cc中): #incl
我目前正在使用 java 制作数独游戏,但我似乎无法弄清楚如何正确地循环我的扫描仪。到目前为止,它打印了这个: . 1 . | 3 . . | 8 . . 5 . 9 | 6 . . | 7 . .
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 12 个月前关闭。 Improve
我正在一个由随机生成的数字(从 1 到 4)填充的多维数组中创建一个 4x4 数独游戏。现在我必须搜索重复项并用其他随机数替换它们,直到单行、单列和四个 2x2 子矩阵上都有唯一的数字。我怎样才能做到
我正在制作一个数独板 GUI,它应该看起来像这样 http://www.sudoku.4thewww.com/Grids/grid.jpg 由于某种原因,它只显示最后一个 3*3 板。如果有人能告诉我
嘿,我写了这个程序来解决数独问题,但它只适用于数独矩阵的几个单元格,而其他单元格则返回 0 。你能明白这有什么问题吗?我是 Java 编码新手,无法编写简单的程序真的很痛苦。 public class
这里是 Stack Overflow 的第一个定时器! 首先,我正在使用 JavaFX 创建一个数独求解器。我一切正常,但是,我遇到的唯一问题是创建粗体 3x3 大块,每个大块内有 3x3 单元格。我
我的逻辑求解算法有问题。它很好地解决了具有大量提示的谜题,它只是解决了少于 45 条线索的谜题。 这是求解的算法。 Immutable 是一个 boolean 值,用于确定该值是否可以更改。 cell
我正在尝试使用 Python 线性优化库 Pulp 来解决 killer 数独问题。 https://en.wikipedia.org/wiki/Killer_sudoku 这是我迄今为止的尝试,添加
我是一名优秀的程序员,十分优秀!