穿越雷区
必须交替地穿越正和负
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征)
坦克车只能水平或垂直移动到相邻的区,怎样走才能路径最短?
输入:
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
输出:
10
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class P{
int x,y,d;
P(int a,int b,int c){
x=a;y=b;d=c;
}
}
public class Main{
static char map[][];
static int visit[][];
static int n=0;
public static void main(String[] args){
Scanner in=new Scanner(System.in);
n=in.nextInt();
map=new char [n][n];
visit=new int [n][n];
int a_x=0,a_y = 0;
for(int i = 0; i <n; i++)
for(int j = 0; j <n; j++){
char temp=in.next().charAt(0);
map[i][j]=temp;
if(temp=='A'){//记录起点A的坐标
a_x=i;a_y=j;
}
}
Queue<P>Q=new LinkedList<P>();
visit[a_x][a_y]=1;
Q.offer(new P(a_x,a_y,0));
while(!Q.isEmpty()){
P v=Q.poll();
if(map[v.x][v.y]=='B'){//出口
System.out.println(v.d);
break;
}
//移动注意边界值
if(v.x!=n-1&&map[v.x][v.y]!=map[v.x+1][v.y]&&visit[v.x+1][v.y]==0){
visit[v.x+1][v.y]=1;
Q.offer(new P(v.x+1,v.y,v.d+1));
}
if(v.y!=n-1&&map[v.x][v.y]!=map[v.x][v.y+1]&&visit[v.x][v.y+1]==0){
visit[v.x][v.y+1]=1;
Q.offer(new P(v.x,v.y+1,v.d+1));
}
if(v.x>0&&map[v.x][v.y]!=map[v.x-1][v.y]&&visit[v.x-1][v.y]==0){
visit[v.x-1][v.y]=1;
Q.offer(new P(v.x-1,v.y,v.d+1));
}
if(v.y>0&&map[v.x][v.y]!=map[v.x][v.y-1]&&visit[v.x][v.y-1]==0){
visit[v.x][v.y-1]=1;
Q.offer(new P(v.x,v.y-1,v.d+1));
}
}
}
}