- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
大家好, 我尝试了八个难题的解决方案发布 here由 joel Neely 玩弄并修改它,以便可以用来解决更高的网格[将网格的字符串表示更改为二维整数表示并修改相应的逻辑]。然而,修改后的代码可以解决 3x3 网格,但很快就会用完 4x4 网格的堆空间。我想这是由所使用的算法引起的限制,我认为这是一些分支定界法的变体,而不是 java 的变体。如果我的假设是正确的,有人可以建议任何其他好的算法来解决这个问题吗?如果没有,请提示可以做些什么来制作这个程序适用于高阶网格。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
class EightPuzzle {
//Queue<Integer[][]> agenda = new LinkedList<Integer[][]>(); // Use of Queue Implemented using LinkedList for Storing All the Nodes in BFS.
//Map<Integer[][],Integer> stateDepth = new HashMap<Integer[][], Integer>(); // HashMap is used to ignore repeated nodes
//Map<Integer[][],Integer[][]> stateHistory = new HashMap<Integer[][],Integer[][]>(); // relates each position to its predecessor
Map<String,String> stateHistory = new HashMap<String,String>(); // relates each position to its predecessor
Map<String,Integer> stateDepth = new HashMap<String,Integer>();
Queue<Integer[][]> agenda=new LinkedList<Integer[][]>();
final int GRIDSIZE=4;
int row=0,col=0;
public static void main(String args[]){
// Integer[][] str="087465132"; // Input the Board State as a Integer[][] with 0 as the Blank Space
Integer init[][]={{1,3,12,4},{2,9,10,7},{0,14,8,15},{5,6,13,11}};
//Integer init[][]={{0,8,7},{4,6,5},{1,3,2}};
EightPuzzle e = new EightPuzzle(); // New Instance of the EightPuzzle
e.add(init,null); // Add the Initial State
while(!e.agenda.isEmpty()){
Integer[][] currentState = e.agenda.remove();
e.up(currentState); // Move the blank space up and add new state to queue
e.down(currentState); // Move the blank space down
e.left(currentState); // Move left
e.right(currentState); // Move right and remove the current node from Queue
}
System.out.println("Solution doesn't exist");
}
//Add method to add the new Integer[][] to the Map and Queue
void add(Integer newState[][], Integer oldState[][]){
if(!stateDepth.containsKey(convertToString(newState))){
int newValue = oldState == null ? 0 : stateDepth.get(convertToString(oldState)) + 1;
stateDepth.put(convertToString(newState), newValue);
agenda.add(newState);
stateHistory.put(convertToString(newState), convertToString(oldState));
}
}
/* Each of the Methods below Takes the Current State of Board as Integer[][]. Then the operation to move the blank space is done if possible.
After that the new Integer[][] is added to the map and queue.If it is the Goal State then the Program Terminates.
*/
void up(Integer[][] currentState){
Integer[][] nextState=new Integer[GRIDSIZE][GRIDSIZE];
getIndicesOfZero(currentState, nextState);
if(row!=0){
nextState[row-1][col]=currentState[row][col];
nextState[row][col]=currentState[row-1][col];
checkCompletion(currentState, nextState);
}
}
/**
* @param currentState
*/
/**
* @param currentState
*/
void down(Integer[][] currentState){
Integer[][] nextState=new Integer[GRIDSIZE][GRIDSIZE];
getIndicesOfZero(currentState, nextState);
if(row!=GRIDSIZE-1){
nextState[row+1][col]=currentState[row][col];
nextState[row][col]=currentState[row+1][col];
checkCompletion(currentState, nextState);
}
}
void left(Integer[][] currentState){
Integer[][] nextState=new Integer[GRIDSIZE][GRIDSIZE];
getIndicesOfZero(currentState, nextState);
if(col!=0){
nextState[row][col-1]=currentState[row][col];
nextState[row][col]=currentState[row][col-1];
checkCompletion(currentState, nextState);
}
}
void right(Integer[][] currentState){
Integer[][] nextState=new Integer[GRIDSIZE][GRIDSIZE];
getIndicesOfZero(currentState, nextState);
if(col!=GRIDSIZE-1){
nextState[row][col+1]=currentState[row][col];
nextState[row][col]=currentState[row][col+1];
checkCompletion(currentState, nextState);
}
}
private void checkCompletion(Integer[][] oldState, Integer[][] newState) {
add(newState, oldState);
Integer[][] completeState={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
//Integer[][] completeState={{1,2,3},{4,5,6},{7,8,0}};
boolean equality=true;
outer:for(int i=0;i<GRIDSIZE;i++){
for(int j=0;j<GRIDSIZE;j++){
if(newState[i][j]!=completeState[i][j]){
equality=false;
break outer;
}
}
}
if(equality){
System.out.println("Solution Exists at Level "+stateDepth.get(convertToString(newState))+" of the tree");
String traceState = convertToString(newState);
while (traceState != null) {
System.out.println(traceState + " at " + stateDepth.get(traceState));
traceState = stateHistory.get(traceState);
}
System.exit(0);
}
}
String convertToString(Integer[][] a){
String str="";
if(a!=null){
for(int i=0;i<GRIDSIZE;i++){
for(int j=0;j<GRIDSIZE;j++){
str+=a[i][j];
}
}
}
else{
str=null;
}
return str;
}
void getIndicesOfZero(Integer[][] currentState,Integer[][] nextState){
for(int i=0;i<GRIDSIZE;i++){
for(int j=0;j<GRIDSIZE;j++){
nextState[i][j]=currentState[i][j];
}
}
outer:for(int i=0;i<GRIDSIZE;i++){
for(int j=0;j<GRIDSIZE;j++){
if(currentState[i][j]==0){
row=i;
col=j;
break outer;
}
}
}
}
}
提前致谢,保罗。
最佳答案
您的算法缺乏启发式。换句话说,它是在没有指导的情况下探索搜索空间。对于 15-puzzle,这个空间相当大,接近 3**(解的深度)。
如果您按每个图 block 与其目的地的曼哈顿距离之和对队列进行排序,则可能足以使其可解。在每一步中,扩展议程上“错误”最少的项目。
此外,您确定您选择的起始状态是可解的吗?如果随机排列方 block ,则只有 50-50 的机会。
最后,您可能会从 Integer
切换到 byte
以节省内存。多少取决于 java 实现,但由于 Integer 是一个类而 byte 是一个基本类型,所以它可能很重要。
已更新
关于java - Java 堆空间用完- 15 谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1906676/
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 7 年前。 我正在尝试解开这个谜团: in
很难为这个问题找到合适的标题。欢迎编辑! :) 这是我的来源xml代码: [color hex] [color hex] [color he
编辑:看起来像一个索引问题,在问题底部更新 我有以下查询 + 子查询,其结果我无法解释。我从这个最小的输入数据集开始(这里的应用程序正在捕获数据变化,PK 是 id + tx_id)。 mysql>
基本上,我在这里试图实现的是让全局变量具有指向结构的指针数组,其大小在编译时是未知的——在我下面的示例中,它是 my_struct **tab。在最终版本中,我想调用一个 JNI 方法来初始化我的指针
所以我想弄清楚这个谜题: function fun1(){ var result = []; for (var i = 0; i < 5; i++){ result.p
一群 child 围成一圈。选择第一个 child ,他们从那个 child 开始顺时针计数,直到达到固定数字(n,在游戏开始时给出)。当计数达到 n 时,第 n 个位置的 child 被淘汰。游戏从
(我是 JS 新手,所以请耐心等待)我正在使用 table 来构建滑动益智游戏。我需要一个可以扰乱值的函数,但我不确定应该如何让它显示在表格单元格中。现在我的代码只是按顺序显示数字。 我有两个函数 -
我有一个 UserForm,xForm,它在类模块(假设为 TestClass)中实例化为: 'TestClass Dim Form as New xForm Private WithEvents E
如果没有循环或游标,如何获取日期间隔列表并将它们转换为 1 和 0 的字符串,这样: 每一位代表从 min(所有日期)到 max(所有日期)的每一天 如果该天属于任何日期间隔,则该位为 1 如果该天不
我读过很多A*算法的伪代码,但它们都没有真正解释如何输出解。我相信我理解使用优先级队列表示尚未访问的内容和使用已探索的表的概念,但是当我执行该算法时,我不知道在什么时候打印出结果。有没有人有一个伪代码
以下两个查询不会返回相同的结果。为什么? 注意 :我发现这个问题是一个 Mysql 难题,我没有关于这个问题的更多数据? SELECT table1.* FROM table1 LEFT JOIN t
如果您对我应该如何在 python 中执行以下任务有任何建议,我正在徘徊:假设我有以下类(class): class A(object): self._classes = [] def
我很难理解如何在不引起内存分配问题的情况下解决这个问题。我很确定我的逻辑是合理的,但不幸的是,这似乎还不够好。有没有人对此有任何建议,以便我了解如何更有效地编写代码? 问题来了:示例输入:1个5 2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
所以这是一个难题: “kb”是扩展 java.util.Hashtable 的类的实例键是一个字符串,存储的值是一个名为“IntelCard”的类 此代码提取 key ,并尝试从表中打印数据
我有以下难题要解决,但我不确定我该怎么做。它说: 有一个 Ubuntu Linux C 程序可以输出变量的地址。 v1: 0xa156128 v2: 0xff97410c v3: 0xf750e34b
我有一个简单的 HTML 页面如下:- Col1 Col2
大家好, 我尝试了八个难题的解决方案发布 here由 joel Neely 玩弄并修改它,以便可以用来解决更高的网格[将网格的字符串表示更改为二维整数表示并修改相应的逻辑]。然而,修改后的代码可以解决
我正在尝试解决下文详述的 projecteuler 难题。我当前的函数适用于数字 1 到 10,但是当我尝试 1 到 20 时,它会一直循环下去而没有结果。 2520 is the smallest
我在为基于图 block 的游戏编写随机关卡生成器时遇到了一个有趣的问题。我已经为它实现了一个强力求解器,但它的速度呈指数级下降,而且绝对不适合我的用例。我不一定要寻找完美的解决方案,我会对性能良好的
我是一名优秀的程序员,十分优秀!