java拯救公主_Java实现 计蒜客 拯救行动

拯救行动

公主被恶人抓走,被关押在牢房的某个地方。牢房用 N \times M (N, M \le 200)N×M(N,M≤200) 的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。

英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是 “骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。

现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要 11 个单位时间,杀死一个守卫需要花费额外的 11 个单位时间。同时假设骑士足够强壮,有能力杀死所有的守卫。

给定牢房矩阵,公主、骑士和守卫在矩阵中的位置,请你计算拯救行动成功需要花费最短时间。

输入格式

1、两个整数代表 NN 和 M, (N, M \le 200)M,(N,M≤200).

2、随后 NN 行,每行有 MM 个字符。"@" 代表道路,“a” 代表公主,“r” 代表骑士,“x” 代表守卫, “#” 代表墙壁。

输出格式

如果拯救行动成功,输出一个整数,表示行动的最短时间。

如果不可能成功,输出 “Impossible”。

输出时每行末尾的多余空格,不影响答案正确性

样例输入1

7 8

#@#####@

#@a#@@r@

#@@#x@@@

@@#@@#@#

#@@@##@@

@#@@@@@@

@@@@@@@@

样例输出1

13

样例输入2

13 40

@x@@##x@#x@x#xxxx##@#x@x@@#x#@#x#@@x@#@x

xx###x@x#@@##xx@@@#@x@@#x@xxx@@#x@#x@@x@

#@x#@x#x#@@##@@x#@xx#xxx@@x##@@@#@x@@x@x

@##x@@@x#xx#@@#xxxx#@@x@x@#@x@@@x@#@#x@#

@#xxxxx##@@x##x@xxx@@#x@x####@@@x#x##@#@

#xxx#@#x##xxxx@@#xx@@@x@xxx#@#xxx@x#####

#x@xxxx#@x@@@@##@x#xx#xxx@#xx#@#####x#@x

xx##@#@x##x##x#@x#@a#xx@##@#@##xx@#@@x@x

x#x#@x@#x#@##@xrx@x#xxxx@##x##xx#@#x@xx@

#x@@#@###x##x@x#@@#@@x@x@@xx@@@@##@@x@@x

x#xx@x###@xxx#@#x#@@###@#@##@x#@x@#@@#@@

#@#x@x#x#x###@x@@xxx####x@x##@x####xx#@x

#x#@x#x######@@#x@#xxxx#xx@@@#xx#x#####@

样例输出2

7

PS:还差一个样例,还望大佬指点

import java.util.LinkedList;

import java.util.Scanner;

public class Main {

private static class Node {

int x;

int y;

int step;

public Node() {

}

public Node(int x, int y, int step) {

this.x = x;

this.y = y;

this.step = step;

}

}

private static int N = 220;

private static LinkedList queue = new LinkedList<>();

private static int r, c;

private static char map[][] = new char[N][N];

private static boolean vis[][] = new boolean[N][N];

private static int dir[][] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

private static void bfs(int sx, int sy, int ex, int ey) {

boolean flag = true;

Node n = new Node(sx, sy, 0);

queue.add(n);

// vis[sx][sy] = true;

while (!queue.isEmpty()) {

Node nowP = queue.peek();

// int dis = nowP.step;

if (nowP.x == ex && nowP.y == ey) {

flag = false;

if(nowP.step==0) flag=true;

elseSystem.out.println(nowP.step);

break;

} else {

if (map[nowP.x][nowP.y] == 'x') {

map[nowP.x][nowP.y] = '@';

// vis[nowP.x][nowP.y] = false;

queue.add(new Node(nowP.x, nowP.y, nowP.step + 1));

} else {

for (int i = 0; i < 4; i++) {

int nx = nowP.x + dir[i][0];

int ny = nowP.y + dir[i][1];

if (nx >= 0 && nx < r && ny >= 0 && ny < c && !vis[nx][ny] && map[nx][ny] != '#') {

vis[nx][ny] = true;

queue.add(new Node(nx,ny,nowP.step+1));

}

}

}

}

queue.pop();

}

if (flag) {

System.out.println("Impossible");

}

}

public static void main(String[] args) {

int sx = 0, sy = 0, ex = 0, ey = 0;

boolean bool1 = false ,bool2 = false;

Scanner sc = new Scanner(System.in);

r = sc.nextInt();

c = sc.nextInt();

//sc.nextLine();

for (int i = 0; i < r; i++) {

String s = sc.next();

map[i] = s.toCharArray();

}

for (int i = 0; i < r; i++) {

for (int j = 0; j < c; j++) {

if (map[i][j] == 'r') {

sx = i;

sy = j;

bool1=true;

}

if (map[i][j] == 'a') {

ex = i;

ey = j;

bool2=true;

// map[i][j] = '@';

}

}

}

if(bool1 && bool2)

bfs(sx, sy, ex, ey);

elseSystem.out.println("Impossible");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值