BFS广搜求最短路径:《穿越雷区》(Java语言原创)

穿越雷区
必须交替地穿越正和负
某坦克需要从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));

    }

    }

    }       

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值