您的位置:首页 > 其它

POJ 3984 迷宫问题

2014-01-22 17:42 253 查看
题目大意:求出迷宫出口的最短路线,输出路径~
Description
定义一个二维数组:
int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

import java.util.Scanner;
import java.util.Stack;

public class Main {

private class Point{
int x=0;
int y=0;

public Point(int x,int y){
this.x=x;
this.y=y;
}

public boolean equals(Point p){
return(x==p.x)&&(y==p.y);
}
@Override
//Override(重写)是子类与父类的一种多态性体现。
//Override允许子类改变父类的一些行为。
public String toString(){
return "("+x+","+y+")";
}
}

private int[][] maze=null;//迷宫图
private Stack<Point>stack=new Stack<Point>();//路径栈

public Main(int[][] maze){
this.maze=maze;
}

public void go(){
Point out=new Point(maze.length-1,maze[0].length-1);//出口
Point in=new Point(0,0);//入口
Point curNode=in;//当前点为入口(当前点)
Point nextNode=null;//下一个访问点(目标点)

while(!curNode.equals(out)){
nextNode=new Point(curNode.x,curNode.y);//设置目标点为当前点,便于偏移。
if((curNode.x+1)<maze.length&&maze[curNode.x+1][curNode.y]==0){
nextNode.x++;//下路
}else if((curNode.y+1)<maze[0].length&&maze[curNode.x][curNode.y+1]==0){
nextNode.y++;//右路
}else if((curNode.x-1)>=0&&maze[curNode.x-1][curNode.y]==0){
nextNode.x--;//上路
}else if((curNode.y-1)>=0&&maze[curNode.x][curNode.y-1]==0){
nextNode.y--;//左路
}else{//无路
maze[curNode.x][curNode.y]=3;//标记为死路
if(stack.isEmpty()){//判断栈是否为空
System.out.println("Non solutioin");
return;
}
curNode=stack.pop();//弹出上一次的点
continue;//继续循环
}

//有路
stack.push(curNode);//当前的压入栈
maze[curNode.x][curNode.y]=2;//标记为已走
curNode=nextNode;//移动当前点
}

if(nextNode.equals(out)){
stack.push(nextNode);//将出口点添加到当前路径中
maze[nextNode.x][nextNode.y]=2;//标记为已走
}

for(int i=0;i<stack.size();i++){
System.out.println(stack.elementAt(i));
}
}

public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int[][] maze=new int[5][5];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
maze[i][j]=sc.nextInt();

new Main(maze).go();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: