poj java_POJ 3083 java实现

这是我见过的最离谱的一道题.....

需要两次DFS+一次BFS

需要注意:

1.BFS记得Visit数组,对于访问过的节点,不要再加入到队列中,否则会内存溢出

2.DFS注意方向.以from-->to的方向为基准,标记好前后左右,再进行dfs.

以下是AC代码:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.ArrayDeque;

import java.util.StringTokenizer;

public class Main {

static boolean[][] isVisit;

static char[][] road;

static int ans, m, n;

static boolean hasAns;

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine());

int T = Integer.parseInt(st.nextToken());

for (int testcase = 1; testcase <= T; testcase++) {

st = new StringTokenizer(br.readLine());

n = Integer.parseInt(st.nextToken());

m = Integer.parseInt(st.nextToken());

isVisit = new boolean[m][n];

road = new char[m][n];

String s;

int startX = 0, startY = 0, endX = 0, endY = 0;

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

s = br.readLine();

road[i] = s.toCharArray();

if (s.indexOf('S') != -1) {

startX = i;

startY = s.indexOf('S');

}

if (s.indexOf('E') != -1) {

endX = i;

endY = s.indexOf('S');

}

}

ans = 0;

hasAns = false;

dfs(startX, startY, 'u');

System.out.print(ans + " ");

ans = 0;

hasAns = false;

dfs2(startX, startY, 'u');

System.out.print(ans + " ");

ans = 0;

isVisit = new boolean[m][n];

bfs(startX, startY);

System.out.println(ans);

}

}

private static void dfs(int x, int y, char direct) {

ans++;

if(hasAns){

return;

}

if (road[x][y] == 'E') {

hasAns = true;

return;

}

if (direct == 'u') {

if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs(x, y - 1, 'l');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs(x - 1, y, 'u');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs(x, y + 1, 'r');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs(x + 1, y, 'd');

}

}

else if (direct == 'l') {

if (x + 1 < m && road[x + 1][y] != '#') {

dfs(x + 1, y, 'd');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs(x, y - 1, 'l');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs(x - 1, y, 'u');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs(x, y + 1, 'r');

}

}

else if (direct == 'd') {

if (y + 1 < n && road[x][y + 1] != '#') {

dfs(x, y + 1, 'r');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs(x + 1, y, 'd');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs(x, y - 1, 'l');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs(x - 1, y, 'u');

}

}

else if (direct == 'r') {

if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs(x - 1, y, 'u');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs(x, y + 1, 'r');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs(x + 1, y, 'd');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs(x, y - 1, 'l');

}

}

}

private static void dfs2(int x, int y, char direct) {

ans++;

if(hasAns){

return;

}

if (road[x][y] == 'E') {

hasAns = true;

return;

}

if (direct == 'u') {

if (y + 1 < n && road[x][y + 1] != '#') {

dfs2(x, y + 1, 'r');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs2(x - 1, y, 'u');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs2(x, y - 1, 'l');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs2(x + 1, y, 'd');

}

}

else if (direct == 'l') {

if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs2(x - 1, y, 'u');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs2(x, y - 1, 'l');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs2(x + 1, y, 'd');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs2(x, y + 1, 'r');

}

}

else if (direct == 'd') {

if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs2(x, y - 1, 'l');

} else if (x + 1 < m && road[x + 1][y] != '#') {

dfs2(x + 1, y, 'd');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs2(x, y + 1, 'r');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs2(x - 1, y, 'u');

}

}

else if (direct == 'r') {

if (x + 1 < m && road[x + 1][y] != '#') {

dfs2(x + 1, y, 'd');

} else if (y + 1 < n && road[x][y + 1] != '#') {

dfs2(x, y + 1, 'r');

} else if (x - 1 >= 0 && road[x - 1][y] != '#') {

dfs2(x - 1, y, 'u');

} else if (y - 1 >= 0 && road[x][y - 1] != '#') {

dfs2(x, y - 1, 'l');

}

}

}

private static void bfs(int xx, int yy) {

ArrayDeque next = new ArrayDeque();

next.addLast(new int[]{xx, yy, 1});

int[] poll;

int x, y, dist;

while (!next.isEmpty()) {

poll = next.pollFirst();

x = poll[0];

y = poll[1];

dist = poll[2];

if (road[x][y] == 'E') {

ans = dist;

return;

}

if(isVisit[x][y]){

continue;

}

isVisit[x][y] = true;

if (x + 1 < m && road[x + 1][y] != '#' && !isVisit[x + 1][y]) {

next.addLast(new int[]{x + 1, y, dist + 1});

}

if (y - 1 >= 0 && road[x][y - 1] != '#' && !isVisit[x][y - 1]) {

next.addLast(new int[]{x, y - 1, dist + 1});

}

if (x - 1 >= 0 && road[x - 1][y] != '#' && !isVisit[x - 1][y]) {

next.addLast(new int[]{x - 1, y, dist + 1});

}

if (y + 1 < n && road[x][y + 1] != '#' && !isVisit[x][y + 1]) {

next.addLast(new int[]{x, y + 1, dist + 1});

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您的问题,我理解您想了解POJ1328问题的Java解决方案。POJ1328是一个经典的问题,也被称为"雷达安装"问题,它涉及到在一个二维平面上安装雷达以覆盖所有岛屿的最小雷达数量。以下是一个Java解决方案的示例代码: ```java import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int caseNum = 1; while (true) { int n = scanner.nextInt(); if (n == 0) { break; } Island[] islands = new Island[n]; for (int i = 0; i < n; i++) { int x = scanner.nextInt(); int y = scanner.nextInt(); islands[i] = new Island(x, y); } int radarNum = getRadarNum(islands); System.out.println("Case " + caseNum + ": " + radarNum); caseNum++; } } private static int getRadarNum(Island[] islands) { Arrays.sort(islands, Comparator.comparingInt(Island::getRight)); int radarNum = 1; int rightMost = islands[0].getRight(); for (int i = 1; i < islands.length; i++) { if (islands[i].getLeft() > rightMost) { radarNum++; rightMost = islands[i].getRight(); } else { rightMost = Math.min(rightMost, islands[i].getRight()); } } return radarNum; } static class Island { private int left; private int right; public Island(int left, int right) { this.left = left; this.right = right; } public int getLeft() { return left; } public int getRight() { return right; } } } ``` 这段代码通过输入岛屿的坐标,计算出需要安装的最小雷达数量,并输出结果。它使用了排序和贪心算法的思想来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值