0

我们正在为学校的一个项目制作一个幻灯片拼图。我们成功地制作了这个谜题,但现在我们想要制作一个“人工智能”。这意味着计算机可以计算出最短的解决方案并解决难题。

我们正在制作一棵树,这样他就可以寻找解决方案。我们总是得到“nosuchelement”的错误。

ArrayList positiesVoorHint = 这是随机排列的数组列表中碎片的位置,我们自己进行了随机排列。

oplossingsposities.add(i) = 这些是索引 0 上的片段名称,它是片段编号 1

我们还在另一个类中定义了 UP、DOWN、LEFT、RIGHT 方法,它们运行良好。

testPuzzelOpgelost = testpuzzlesolved

由于我们的方法 UP、DOWN、LEFT RIGHT,我们还必须克隆列表。别担心。

(我们的母语不是英语)。


这是我们单击按钮时使用的代码,因此他离最短解决方案更近了一步:

public ArrayList<Integer> HintUitvoeren()
 {
  ArrayList<Integer> positiesNaHint;
  HintBerekenen2 hint = new HintBerekenen2(posities, dimensie);
  ArrayList<ArrayList<Integer>> positieMatrix = hint.oplossingspad;
  afbeeldingenPlaatsen();
  positiesNaHint = positieMatrix.get(1);
  return positiesNaHint;
 }

这段代码应该很好

问题应该在这里:

这是代码;(由于某种原因,它不会显示为代码,也有 4 个空格)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;

public class HintBerekenen2 extends Bewegingen
{
 Queue<ArrayList<Integer>> wachtrij;
 Map<ArrayList<Integer>, ArrayList<Integer>> boom;
 int dimensie;
 Bewegingen bew;
 ArrayList<ArrayList<Integer>> oplossingspad;
 ArrayList<Integer> meestRecentePosities, oplossingsposities;

 public HintBerekenen2 (ArrayList<Integer> positiesVoorHint, int dimensie)
 {
  System.out.println("HINT START HIER");
  this.dimensie = dimensie;

  wachtrij = new LinkedList<ArrayList<Integer>>();
  boom = new HashMap<ArrayList<Integer>,ArrayList<Integer>>();
  bew = new Bewegingen();


  //Oplossings ArrayList maken. ([1, 2, ..., (dimensie*dimensie) - 1,         (dimensie*dimensie)]
  oplossingsposities = new ArrayList<Integer>();

  for (int i = 1; i < (dimensie*dimensie) + 1; i++)
  {
   oplossingsposities.add(i);
  }

  voegToeAanBoom(positiesVoorHint, null);
  berekenen();
 }

 void voegToeAanBoom(ArrayList<Integer> nieuwePositie, ArrayList<Integer> oudePositie)
 {
  if (!boom.containsKey(nieuwePositie))
  {
   wachtrij.add(nieuwePositie);
   boom.put(nieuwePositie, oudePositie);
  }
 }

 void berekenen()
 {
  while (oplossingspad == null)
  {
   System.out.println(wachtrij + " voor remove");
   ArrayList<Integer> lijst = this.wachtrij.remove();
   System.out.println(wachtrij + " na remove");
   this.UP (lijst);
   this.DOWN (lijst);
   this.LEFT (lijst);
   this.RIGHT (lijst); 
  }
 }

 private void testPuzzelOpgelost(ArrayList<Integer> positiesVoorBeweging,     ArrayList<Integer> positiesNaBeweging)
 {
  System.out.println("Test wordt uitgevoerd");
  System.out.println(positiesVoorBeweging + " positiesVoorBeweging in de testPuzzel");
  System.out.println(positiesNaBeweging + " positiesNaBeweging in de testPuzzel");

  voegToeAanBoom (positiesNaBeweging, positiesVoorBeweging);

  if (positiesNaBeweging.equals(oplossingsposities))
  {
   ArrayList<Integer> zoekPositie = positiesNaBeweging;
   oplossingspad = new ArrayList<ArrayList<Integer>>();
   while (zoekPositie != null)
   {
    oplossingspad.add(0, zoekPositie);
    zoekPositie = boom.get(zoekPositie);
   }
  }
 }

 void UP (ArrayList<Integer> positiesVoorBeweging)
 {
  int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);

  ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
  meestRecentePosities = bew.UP(dimensie, positiesVoorBeweging, indexLeegStukje);

  if(meestRecentePosities != cloneLijst)
  {
   testPuzzelOpgelost(cloneLijst, meestRecentePosities);
  }
 }

 void DOWN (ArrayList<Integer> positiesVoorBeweging)
 {
  int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);

  ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
  meestRecentePosities = bew.DOWN(dimensie, positiesVoorBeweging, indexLeegStukje);

  if(meestRecentePosities != cloneLijst)
  {
   testPuzzelOpgelost(cloneLijst, meestRecentePosities);
  }
 }

 void LEFT (ArrayList<Integer> positiesVoorBeweging)
 {
  int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);

  ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
  meestRecentePosities = bew.LEFT(dimensie, positiesVoorBeweging, indexLeegStukje);

  if(meestRecentePosities != cloneLijst)
  {
   testPuzzelOpgelost(cloneLijst, meestRecentePosities);
  }
 }

 void RIGHT (ArrayList<Integer> positiesVoorBeweging)
 {
  int indexLeegStukje = positiesVoorBeweging.indexOf(dimensie*dimensie);

  ArrayList<Integer> cloneLijst = (ArrayList<Integer>) positiesVoorBeweging.clone();
  meestRecentePosities = bew.RIGHT(dimensie, positiesVoorBeweging, indexLeegStukje);

  if(meestRecentePosities != cloneLijst)    
  {
   testPuzzelOpgelost(cloneLijst, meestRecentePosities);
  }
 }
}

这是错误代码

Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
 at java.util.LinkedList.remove(LinkedList.java:788)
 at java.util.LinkedList.removeFirst(LinkedList.java:134)
 at java.util.LinkedList.remove(LinkedList.java:481)
 at Mozaiq.HintBerekenen2.berekenen(HintBerekenen2.java:56)
 at Mozaiq.HintBerekenen2.<init>(HintBerekenen2.java:39)
 at Mozaiq.Schuifpuzzelpaneel.HintUitvoeren(Schuifpuzzelpaneel.java:74)
 at Mozaiq.Gamepaneel.actionPerformed(Gamepaneel.java:126)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
 at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
 at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
 at java.awt.Component.processMouseEvent(Component.java:6382)
4

0 回答 0