普及练习场 深度优先搜索 迷宫
来源:互联网 发布:windows无法删除密码 编辑:程序博客网 时间:2024/06/09 20:42
题目链接
题意理解
这题目按道理来说就是随便写,但是翻车了一下,没有1A,是因为,这题目有点坑。。。终点位置会给你放置一个障碍物 我的dfs有一点点问题,但是我已经重写过了。
代码
import java.util.Scanner;public class Main { static int[][] changes = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; static int N; static int M; static boolean[][] canPass; static boolean[][] visited; static int sx; static int sy; static int fx; static int fy; static int T; static int cnt = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); N = scanner.nextInt(); M = scanner.nextInt(); canPass = new boolean[N][M]; visited = new boolean[N][M]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { canPass[i][j] = true; visited[i][j] = false; } } T = scanner.nextInt(); sx = scanner.nextInt(); sx -= 1; sy = scanner.nextInt(); sy -= 1; visited[sx][sy] = true; fx = scanner.nextInt(); fx -= 1; fy = scanner.nextInt(); fy -= 1; for (int i = 0; i < T; i++) { int t1 = scanner.nextInt(); t1 -= 1; int t2 = scanner.nextInt(); t2 -= 1; canPass[t1][t2] = false; } scanner.close(); for (int i = 0; i < changes.length; i++) { dfs(sx, sy, changes[i][0], changes[i][1]); } System.out.println(cnt); } static void dfs(int x, int y, int dx, int dy) { int tempX = x + dx; int tempY = y + dy; if (tempX < 0 || tempX >= M || tempY < 0 || tempY >= N) { return; } if (visited[tempX][tempY]) { return; } if (!canPass[tempX][tempY]) { return; } if (x + dx == fx && y + dy == fy) { cnt++; return; } for (int i = 0; i < changes.length; i++) { visited[tempX][tempY] = true; dfs(tempX, tempY, changes[i][0], changes[i][1]); visited[tempX][tempY] = false; } }}
欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理
阅读全文