- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须编写一个蛮力算法以使用预定方法解决数独问题。对于解决方法,我有点精神上的障碍。作业说我们必须至少使用给定的方法,它们是isPermutation
、isPermutationRow
、isPermutationCol
、isPermutationBlock
、isPermutationMatrix
、isValid
和solve
。
我真的不知道什么时候在 solve 方法中返回值,因为它必须是递归的。
如果有任何帮助,我将不胜感激 :)
package gdp.aufgabe22;
public class Sudoku {
public static void main(String[] args) {
int[][] d = { {0,0,3,0,2,0,6,0,0},
{9,0,0,3,0,5,0,0,1},
{0,0,1,8,0,6,4,0,0},
{0,0,8,1,0,2,9,0,0},
{7,0,0,0,0,0,0,0,8},
{0,0,6,7,0,8,2,0,0},
{0,0,2,6,0,9,5,0,0},
{8,0,0,2,0,3,0,0,9},
{0,0,5,0,1,0,3,0,0}
};
int[][] s = solve(d);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(s[i][j] + " ");
}
System.out.print("\n");
}
System.out.println();
}
public static boolean isPermutation(int[] a) {
int[][] key = new int[2][a.length];
key[0] = a;
for (int i = 0; i < key.length; i++) {
key[1][i] = 0;
}
for (int i = 0; i < key.length; i++) {
if (a[i]>0) {
key[1][a[i]-1]++;
}
}
boolean keycheck = false;
for (int i = 0; i < a.length; i++) {
if(key[1][i]>1) {
keycheck = true;
}
}
if (keycheck == true) {
return false;
}
else {
return true;
}
}
public static boolean isPermutationRow(int[][] a, int row) {
int[] key = new int[a[row].length];
key = a[row];
return isPermutation(key);
}
public static boolean isPermutationCol(int[][] a, int col) {
int[] key = new int[a.length];
for (int i = 0; i < key.length; i++) {
key[i] = a[i][col];
}
return isPermutation(key);
}
public static boolean isPermutationMatrix(int[][] a) {
for (int i = 0; i < a.length; i++) {
if (!isPermutationRow(a, i)) {
return false;
}
}
for (int i = 0; i < a.length; i++) {
if (!isPermutationCol(a, i)) {
return false;
}
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
switch (i) {
case 0: switch(j) {
case 0: if(!isPermutationBlock(a,0,2,0,2)) {
return false;
}
case 3: if(!isPermutationBlock(a,0,2,3,5)) {
return false;
}
case 6: if(!isPermutationBlock(a,0,2,6,8)) {
return false;
}
default: break;
}
case 3: switch(j) {
case 0: if(!isPermutationBlock(a,3,5,0,2)) {
return false;
}
case 3: if(!isPermutationBlock(a,3,5,3,5)) {
return false;
}
case 6: if(!isPermutationBlock(a,3,5,6,8)) {
return false;
}
default: break;
}
case 6: switch(j) {
case 0: if(!isPermutationBlock(a,6,8,0,2)) {
return false;
}
case 3: if(!isPermutationBlock(a,6,8,3,5)) {
return false;
}
case 6: if(!isPermutationBlock(a,6,8,6,8)) {
return false;
}
default: break;
}
default: break;
}
}
}
return true;
}
public static boolean isPermutationBlock(int[][] a, int minRow, int maxRow, int minCol, int maxCol) {
int[][] key = new int[2][(maxRow-minRow+1)+(maxCol-minCol+1)];
int[][] countfeld = new int[2][9];
for (int i = 0; i < 9; i++) {
countfeld[0][i] = i+1;
}
int keycount = 0;
for (int i = minRow; i<maxRow; i++) {
for (int j = minCol; j<maxCol; j++) {
key[0][keycount] = a[i][j];
keycount++;
}
}
for (int i = 0; i < countfeld[0].length; i++) {
countfeld[1][i] = 0;
}
for (int i = 0; i < key[0].length; i++) {
if (key[0][i]>0) {
countfeld[1][key[0][i]-1]++;
}
}
boolean keycheck = false;
for (int i = 0; i < key[0].length; i++) {
if(countfeld[1][i]>1) {
keycheck = true;
}
}
if (keycheck == true) {
return false;
}
else {
return true;
}
}
public static boolean isValid(int[][] a) {
if (a.length != 9 || a[0].length != 9) {
return false;
}
return (isPermutationMatrix(a));
}
public static int[][] solve(int[][] a) {
int[] freeslot = findfreeslot(a);
int f1 = freeslot[0];
int f2 = freeslot[1];
if (f1 == -1) {
return a;
}
teilsolve(f1, f2, a);
return a;
}
public static void teilsolve(int f1, int f2, int[][] a) {
int[][] temp = new int[a.length][a[0].length];
for (int y = 0; y < a.length; y++) {
for (int z = 0; z < a[0].length; z++) {
temp[y][z] = a[y][z];
}
}
for (int i = 1; i < 10; i++) {
a[f1][f2] = i;
boolean valide = isValid(a);
if (valide) {
a = solve(a);
break;
}
}
}
public static int[] findfreeslot(int[][]a) {
int[] key = {-1,-1};
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (a[i][j] == 0) {
key[0] = i;
key[1] = j;
return key;
}
}
}
return key;
}
}
最佳答案
你的代码中有很多问题。
首先,isPermutation
方法是错误的:您循环直到 key.length
为 2 而您应该循环到 9 a.length
!该方法应该是:
public static boolean isPermutation(int[] a) {
int[][] key = new int[2][a.length];
key[0] = a;
for (int i = 0; i < a.length; i++) {
key[1][i] = 0;
}
for (int i = 0; i < a.length; i++) {
if (a[i] > 0) {
key[1][a[i] - 1]++;
}
}
boolean keycheck = false;
for (int i = 0; i < a.length; i++) {
if (key[1][i] > 1) {
keycheck = true;
break;
}
}
if (keycheck == true) {
return false;
} else {
return true;
}
}
正如 Patrick J Abare II 所指出的,结尾确实应该是 return !键盘检查;
接下来您尝试使用蛮力,但永远不要原路返回。 solve
、teilsolve
这对方法应该处理任何级别的 Not Acceptable 值,并且应该是:
public static int[][] solve(int[][] a) {
int[] freeslot = findfreeslot(a);
int f1 = freeslot[0];
int f2 = freeslot[1];
if (f1 == -1) {
return a;
}
a = teilsolve(f1, f2, a);
return a;
}
public static int [][] teilsolve(int f1, int f2, int[][] a) {
int [][] temp2;
int[][] temp = new int[a.length][a[0].length];
for (int y = 0; y < a.length; y++) {
for (int z = 0; z < a[0].length; z++) {
temp[y][z] = a[y][z];
}
}
for (int i = 1; i < 10; i++) {
temp[f1][f2] = i;
boolean valide = isValid(temp);
if (valide) {
temp2 = solve(temp);
if (temp2 != null) {return temp2;}
}
}
return null;
}
这样,程序返回:
4 5 3 9 2 1 6 8 7
9 2 7 3 6 5 8 4 1
2 3 1 8 9 6 4 7 5
5 4 8 1 7 2 9 3 6
7 6 9 5 3 4 1 2 8
1 9 6 7 4 8 2 5 3
3 7 2 6 8 9 5 1 4
8 1 4 2 5 3 7 6 9
6 8 5 4 1 7 3 9 2
关于java - 数独蛮力算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909236/
我正在尝试编写一个程序,以表格的形式计算我的结果。我有一个液压升降机,可以显示作用在直径 (D1) 的活塞上的小力(我称之为 F1)可以乘以作用在直径 (D2) 的活塞上的大力 (F2) ,电梯的运行
我有一个 fiddle :https://jsfiddle.net/mvLf579a/284/ 此 fiddle 允许您使用 D3 径向布局来布置力网络,并将布局重置为默认力布局。但是,重置时链接强度
我想实现表格 View 单元格重叠,因为我想实现这种效果: 所以基本上细胞会一个接一个地堆叠。我的目标是 iOS7+(目前正在测试 iOS8)。 我目前正在做一个 CAGradientLayer,它被
尽管在 box2d 前花了几个小时,但我仍然不明白 applyforce 和 applyimpulse 是如何工作的。我尝试使用一些视觉效果来更好地理解正在发生的事情(通过在 body 位置和应用点之
首先,我是 D3 的新手。我正在尝试使用这些示例在单个 D3 图中实现不同的行为: Drag + Zoom 力导向图 但我的图表在几秒钟后卡住,我不明白为什么... 这是我的代码:http://jsf
所以,我在 Xcode 上用 Swift 玩了这个游戏,我有一个跳跃的 SKShapeNode。不过,我希望这种跳跃与玩家的触感相称。因此,小水龙头会跳得小,而轻快的水龙头会跳得更高。怎么可能做到这一
在 ARKit/SceneKit 中,当用户点击按钮时,我想对我的节点施加一个脉冲。我希望冲动来自当前用户的角度。这意味着节点将远离用户的视角。多亏了这段代码,我能够获得当前的方向/方向: func
我正在使用 Angular2 并拥有父子组件。我的子组件正在使用 DatePipe 提供程序,因为父单元测试失败并给出以下错误, 错误:非法状态:无法加载管道 DatePipe 的摘要。 如何解决这个
我是一名优秀的程序员,十分优秀!