队列不能用STL的queue或deque,要自己写。用一维数组实现,维护一个队头指针和队尾指针
import java.util.Scanner;
public class Main {
static int[][] map=new int[5][5];
//考虑到保存路径,所以就没有直接用队列,
//而是用数组模拟的队列,这样能够将东西都保存起来而不弹出
static step[] queue=new step[25];
static class step{
int x,y,pre;//pre存储父节点 的数组下标作为指针
public step(int x,int y,int pre) {
this.x=x;
this.y=y;
this.pre=pre;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getPre() {
return pre;
}
}
static int[][] move = {{0,1},{0,-1},{1,0},{-1,0}};//移动的方向
static int[][] visit=new int[5][5];
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
map[i][j]=reader.nextInt();
int head=0,tail=0;
queue[head]=new step(0, 0,-1);
visit[0][0]=1;
tail++;
while(head<tail) {
boolean flag=false;
for(int i=0;i<4;i++) {
int nx=queue[head].getX()+move[i][0];
int ny=queue[head].getY()+move[i][1];
if(nx >= 0 && nx < 5 && ny >= 0 && ny < 5 && visit[nx][ny] != 1 && map[nx][ny] != 1) {
visit[nx][ny]=1;
queue[tail]=new step(nx, ny, head);
tail++;
}
if(nx==4&&ny==4) {
flag=true;
break;
}
}
if(flag) {
print(queue[tail-1]);
break;
}
head++;//假装弹出队列
}
}
static void print(step s) {
if(s.pre==-1) {
System.out.println("("+s.getX()+", "+s.getY()+")");
return;
}
else {
print(queue[s.getPre()]);
System.out.println("("+s.getX()+", "+s.getY()+")");
}
}
}