我正在尝试制作一个Java程序,它为我提供了8puzzle问题的解决方案
解决方案程序如下:
- 首先我创建一个包含初始网格(初始状态)的初始节点
我将节点放入队列
我测试节点是否是目标,所以我使用堆栈来保存解决方案之路(从节点到初始根目录)
否则我会在队列中添加他的继承者(代表0的可能排列),然后重做测试。
这是代码: 课程名称
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Noued {
int grille[]=new int[9];
int niveau;
Noued suiv1=null;
Noued suiv2=null;
Noued suiv3=null;
Noued suiv4=null;
Noued pred=null;
static void successeur(Noued r)
{Queue<Integer> permut;
Integer elt;
permut=taquin8.Test_permut(taquin8.zero(r.grille));
if(permut.element()!=null){
elt=permut.remove();
r.suiv1=new Noued();
r.suiv1.pred=r;
for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];}
r.suiv1.niveau=r.niveau+1;
r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt];
r.suiv1.grille[elt]=0;
if(permut.element()!=null){
elt=permut.remove();
r.suiv2=new Noued();
r.suiv2.pred=r;
for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];}
r.suiv2.niveau=r.niveau+1;
r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt];
r.suiv2.grille[elt]=0;
}
if(permut.element()!=null){
elt=permut.remove();
r.suiv3=new Noued();
r.suiv3.pred=r;
for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];}
r.suiv3.niveau=r.niveau+1;
r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt];
r.suiv3.grille[elt]=0;
if(permut.element()!=null){
elt=permut.remove();
r.suiv4=new Noued();
r.suiv4.pred=r;
for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];}
r.suiv4.niveau=r.niveau+1;
r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt];
r.suiv4.grille[elt]=0;
}
}
}
}
//afficher un arbre
static void affich_ab(Noued r)
{
if(r!=null){taquin8.affichertab(r.grille);}
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);}
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);}
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);}
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}
}
}
Class Taquin8:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class taquin8 {
static Integer n1,n2;
static int start[] = {1,2,3,4,0,5,7,8,6};
static int goal[] = {1,2,3,4,5,6,7,8,0};
//affichage d'une grille
static void affichertab(int t[])
{
for (int i=0;i<9;i++){
if ((i%3)==2){System.out.println("["+t[i]+"]");}
else {System.out.print("["+t[i]+"]");}
}
}
//rechercher l'indice d'un entier
static int indice_ent(int t[],int x)
{int ind = 10;
for (int i=0;i<9;i++){
if (t[i]==x) ind=i;
}
return ind;
}
//rechercher l'indice de zero
static int zero(int t[])
{int ind = 10;
for (int i=0;i<9;i++){
if (t[i]==0) ind=i;
}
return ind;
}
//egalité de tableau
static boolean egal_tab(int t1[],int t2[])
{int c=0;
for (int i=0;i<9;i++){
if (t1[i]!=t2[i]) c++;
}
if (c==0) {return true;}
else return false;
}
//procedure pour faire la permutation de deux entier
static void permutaion(Integer n1, Integer n2)
{Integer t;
t=n1;
taquin8.n1=n2;
taquin8.n2=t;
}
//Test pour les possibilites de permutaion de 0
static Queue<Integer> Test_permut(int g)
{
Queue<Integer> pp = new LinkedList<Integer>();
switch (g)
{
case 0:
{
pp.add(1);
pp.add(3);
break;}
case 1:
{
pp.add(0);
pp.add(2);
pp.add(4);
break;}
case 2:
{
pp.add(1);
pp.add(5);
break;}
case 3:
{
pp.add(0);
pp.add(4);
pp.add(6);
break;}
case 4:
{
pp.add(1);
pp.add(3);
pp.add(5);
pp.add(7);
break;}
case 5:
{
pp.add(2);
pp.add(4);
pp.add(8);
break;
}
case 6:
{
pp.add(3);
pp.add(7);
break;}
case 7:
{
pp.add(4);
pp.add(6);
pp.add(8);
break;}
case 8:
{
pp.add(5);
pp.add(7);
break;}
default:{};
}
return pp;
}
static //largeur
ArrayList<Noued> largeur(Noued r,ArrayList<Noued> f)
{
f=new ArrayList<Noued>();
f.add(r);
if(!taquin8.egal_tab(r.grille,goal)){
Noued.successeur(r);
if(r.suiv1!=null){f.add(r.suiv1);}
if(r.suiv2!=null){f.add(r.suiv2);}
if(r.suiv3!=null){f.add(r.suiv3);}
if(r.suiv4!=null){f.add(r.suiv4);}
}
return f;
}
//Programme Principal
public static void main(String[] args) {
Queue<Noued> queue = new LinkedList<Noued>();
Stack<Noued> sol = new Stack<Noued>();
Noued rac=new Noued();
rac.grille=start;
rac.niveau=0;
queue.add(rac);
int but=0;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXtest la file le but
while(but==0){
Noued t=queue.element();
if(t.grille.equals(goal)){System.out.println("LE BUUUUUUUUUUUUt");
Noued emp=t;
while(emp.pred!=null){
sol.push(emp);
emp=emp.pred;
}
but=1;
}
else{Noued.successeur(t);
if(t.suiv1!=null){queue.add(rac.suiv1);}
if(t.suiv2!=null){queue.add(rac.suiv2);}
if(t.suiv3!=null){queue.add(rac.suiv3);}
if(t.suiv4!=null){queue.add(rac.suiv4);}
}
queue.remove();
}
//affichage de la frontiere
/*
if(queue!=null){
while(queue.size()!=0){
taquin8.affichertab(queue.remove().grille);
System.out.println("\n");
}
}
*/
if(sol!=null){
while(sol.size()!=0){
taquin8.affichertab(sol.pop().grille);
System.out.println("\n");
}
}
}
}
结果如下:
Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.getFirst(Unknown Source)
at java.util.LinkedList.element(Unknown Source)
at Noued.successeur(Noued.java:53)
at taquin8.main(taquin8.java:208)
答案 0 :(得分:1)
从堆栈跟踪中,permut
队列后面的LinkedList似乎是空的。也就是说,permut
为空。查看Noued.successeur
,我们发现permut
来自taquin8.Test_permut()
。在查看Taquin8.Test_permut
时,我们看到default
案例返回一个空的队列。因此,您需要弄清楚为什么taquin8.Test_permut
进入默认情况。提示:g
超出范围[0:8]。
我建议通过调试器运行代码,或者至少添加一些println语句。
答案 1 :(得分:0)
好的,我解决了先例问题。
但现在我有一个“无限循环”(Taquin8类) 它看起来正确我(Algo方面) 我不知道问题出在哪里!
Class Noued:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Noued {
int grille[]=new int[9];
int niveau;
int vis;
Noued suiv1=null;
Noued suiv2=null;
Noued suiv3=null;
Noued suiv4=null;
Noued pred=null;
static void successeur(Noued r)
{Queue<Integer> permut;
Integer elt;
permut=taquin8.Test_permut(taquin8.zero(r.grille));
if(permut!=null){
if(!permut.isEmpty()){
elt=permut.element();
r.suiv1=new Noued();
r.suiv1.pred=r;
for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];}
r.suiv1.niveau=r.niveau+1;
r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt];
r.suiv1.grille[elt]=0;
permut.remove();
if(!permut.isEmpty()){
elt=permut.element();
r.suiv2=new Noued();
r.suiv2.pred=r;
for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];}
r.suiv2.niveau=r.niveau+1;
r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt];
r.suiv2.grille[elt]=0;
permut.remove();
if(!permut.isEmpty()){
elt=permut.element();
r.suiv3=new Noued();
r.suiv3.pred=r;
for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];}
r.suiv3.niveau=r.niveau+1;
r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt];
r.suiv3.grille[elt]=0;
permut.remove();
if(!permut.isEmpty()){
elt=permut.element();
r.suiv4=new Noued();
r.suiv4.pred=r;
for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];}
r.suiv4.niveau=r.niveau+1;
r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt];
r.suiv4.grille[elt]=0;
permut.remove();
}
}
}
}
}else{System.out.println("\n PERMUT IS EMPTY");}
}
//afficher un arbre
static void affich_ab(Noued r)
{
if(r!=null){taquin8.affichertab(r.grille);}
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);}
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);}
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);}
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}
}
}
Class Taquin8:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class taquin8 {
static Integer n1,n2;
static int start[] = {1,2,3,4,5,6,7,0,8};
static int goal[] = {1,2,3,4,5,6,7,8,0};
//affichage d'une grille
static void affichertab(int t[])
{
for (int i=0;i<9;i++){
if ((i%3)==2){System.out.println("["+t[i]+"]");}
else {System.out.print("["+t[i]+"]");}
}
}
//rechercher l'indice d'un entier
static int indice_ent(int t[],int x)
{int ind = 10;
for (int i=0;i<9;i++){
if (t[i]==x) ind=i;
}
return ind;
}
//rechercher l'indice de zero
static int zero(int t[])
{int ind = 10;
for (int i=0;i<9;i++){
if (t[i]==0) ind=i;
}
return ind;
}
//egalité de tableau
static boolean egal_tab(int t1[],int t2[])
{int c=0;
for (int i=0;i<9;i++){
if (t1[i]!=t2[i]) c++;
}
if (c==0) {return true;}
else return false;
}
//procedure pour faire la permutation de deux entier
static void permutaion(Integer n1, Integer n2)
{Integer t;
t=n1;
taquin8.n1=n2;
taquin8.n2=t;
}
//Test pour les possibilites de permutaion de 0
static Queue<Integer> Test_permut(int g)
{
Queue<Integer> pp = new LinkedList<Integer>();
switch (g)
{
case 0:
{
pp.add(1);
pp.add(3);
break;}
case 1:
{
pp.add(0);
pp.add(2);
pp.add(4);
break;}
case 2:
{
pp.add(1);
pp.add(5);
break;}
case 3:
{
pp.add(0);
pp.add(4);
pp.add(6);
break;}
case 4:
{
pp.add(1);
pp.add(3);
pp.add(5);
pp.add(7);
break;}
case 5:
{
pp.add(2);
pp.add(4);
pp.add(8);
break;
}
case 6:
{
pp.add(3);
pp.add(7);
break;}
case 7:
{
pp.add(4);
pp.add(6);
pp.add(8);
break;}
case 8:
{
pp.add(5);
pp.add(7);
break;}
default:{};
}
return pp;
}
//largeur
//Programme Principal
public static void main(String[] args) {
Queue<Noued> queue = new LinkedList<Noued>();
Stack<Noued> sol = new Stack<Noued>();
Noued rac=new Noued();
rac.grille=start;
rac.niveau=0;
int but=0;
queue.add(rac);
while((but!=1)&&(!queue.isEmpty())){
Noued test=queue.element();
System.out.println("\n---------");
taquin8.affichertab(test.grille);
if(test.grille.equals(goal)){
System.out.println("GOAAAAAAL");
but=1;
}
else{
Noued.successeur(test);
if(test.suiv1!=null){queue.add(test.suiv1);}
if(test.suiv2!=null){queue.add(test.suiv2);}
if(test.suiv3!=null){queue.add(test.suiv3);}
if(test.suiv4!=null){queue.add(test.suiv4);}
}
queue.remove();
}
}
}