首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java迷宫,用数组储存迷宫,用栈存储通路位置,无法打印通路,求指教

2012-12-16 
java迷宫,用数组存储迷宫,用栈存储通路位置,无法打印通路,求指教import java.util.*public class Maze{pu

java迷宫,用数组存储迷宫,用栈存储通路位置,无法打印通路,求指教
import java.util.*;
public class Maze{
   public static void main(String args[]){
      Stack mazeStack=new Stack(); //不能用StackClass来声明栈,也不能指定栈的长度
      int i,j;
      int[][] mm={{0,0,1,0,1},{1,0,1,1,1},{0,0,0,1,1},{0,1,1,0,1},{0,0,1,0,0},{1,0,0,0,0}};
      DetailOfMaze[][] maze=new DetailOfMaze[6][5];
      for(i=0;i<6;i++){
 for(j=0;j<5;j++){
    maze[i][j]=new DetailOfMaze();
    maze[i][j].mazeNode=mm[i][j];
    maze[i][j].footPrint=false;
 }
      }
      i=0;
      j=0;
      do{
 maze[i][j].footPrint=true;
 if(maze[i][j].mazeNode==0) {//若当前位置可通
    mazeStack.push(i);
    mazeStack.push(j);//将当前位置压入栈顶
if(i==5 && j==4)//若当前位置为出口
   break;//退出
else{// 当前位置的邻块换为当前位置
   if(maze[i][j+1].footPrint==false && j<4)
      j=j+1;//向右走
   else if(maze[i+1][j].footPrint==false && i<5)
      i=i+1;//向下走
   else if(maze[i][j-1].footPrint==false && j>0)
      j=j-1;//向左走
   else if(maze[i-1][j].footPrint==false && j>1)
      i=i-1;//向上走
}
    }
 else{
    if(!mazeStack.empty()) {
// 当前位置的逆时针邻块换为当前位置
   if (i>0 && i<6 && j>0 && j<4 && maze[i][j-1].footPrint==true && maze[i+1][j-1].footPrint==false )
      {i=i+1;j=j-1;}//向下走
   else if ( i>0 && i<5 && j>0 && j<4 && maze[i-1][j].footPrint==true && maze[i-1][j-1].footPrint==false )
      {i=i-1;j=j-1;}//向左走
   else if ( i>0 && i<5 && j>0 && j<4 && maze[i][j+1].footPrint==true && maze[i-1][j+1].footPrint==false )
      {i=i-1;j=j+1;}//向上走
           else {
      mazeStack.pop();
      mazeStack.pop();
      if(!mazeStack.empty()){
         Integer J=(Integer)mazeStack.pop();//line 50
         j=J.intValue();
         Integer I=(Integer)mazeStack.pop();
         i=I.intValue();
      }
           } 
    }
  }
      }while(!mazeStack.empty());
//标记通道
   while(!mazeStack.empty()) {
      Integer J=(Integer)mazeStack.pop();


      int pj=J.intValue();
      Integer I=(Integer)mazeStack.pop();
      int pi=I.intValue();
      maze[pi][pj].mazeNode=8;
   }
//打印有通路的迷宫
      for(i=0;i<6;i++){
         for(j=0;j<5;j++){
    System.out.print(maze[i][j].mazeNode);
         }
         System.out.println();
      }
      System.out.println("\n");
   }
}
//存储某个路口的信息
class DetailOfMaze{
   int mazeNode,x,y;
   boolean footPrint; //是否被访问
}

在最后打印出来的是原来的迷宫,为什么不能打印标记通道后的迷宫呢?是标记的那个方法写错了吗?求指教!
[解决办法]
结帖率:0.00%
[解决办法]

引用:
结帖率:0.00%

额。。。这是我发的第二个帖子,刚刚把第一个帖子结了。。。
等答案等的好辛苦啊!
[解决办法]
找到问题的症结了:
在标记通道的时候没有出错,错误出在判断“当前位置的逆时针邻块换为当前位置”处了。这里的判断条件错了。应改为:
if (i>=0 && i<5 && j>0 && j<5 && maze[i][j-1].footPrint==true && maze[i+1][j-1].footPrint==false )
      {i=i+1;j=j-1;}//向下走
else if ( i>0 && i<6 && j>0 && j<5 && maze[i-1][j].footPrint==true && maze[i-1][j-1].footPrint==false )
      {i=i-1;j=j-1;}//向左走
else if ( i>0 && i<6 && j>0 && j<4 && maze[i][j+1].footPrint==true && maze[i-1][j+1].footPrint==false )
      {i=i-1;j=j+1;}

运行OK!

结果为:
88101
18111
88011
81101
88100
18888

热点排行