洛谷P1605 迷宫记录(记录自己刷过的题)

    技术2022-07-12  83

    题目背景

    给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 题目描述

    无 输入格式

    第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。 输出格式

    给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 输入输出样例 输入 #1

    2 2 1 1 1 2 2 1 2

    输出 #1

    1

    说明/提示

    【数据规模】

    1≤N,M≤5

    题解(java语言)

    import java.util.Scanner; public class Main { static point start; static point end; static point[] zb; static int[][]vis; static int[] xx = {0,0,-1,1}; static int[] yy = {-1,1,0,0}; static int N ; static int M; static int ans = 0; static public void dfs(point p){ //越界跳出 if(p.x<0 || p.x>M-1 || p.y<0 || p.y>N-1){ return ; } //当前点等于终点 记数++,并结束当前函数 if(p.x == end.x && p.y == end.y){ ans++; return ; } //4个方向查找 for(int i=0;i<4;i++){ int dx = p.x + xx[i]; int dy = p.y + yy[i]; point po = new point(dx,dy); //vis的值 0表示可以访问 1和2表示不能访问 if( dx>-1 && dx<=M-1 && dy>-1 && dy<=N-1 && vis[dx][dy] ==0 ){ //标记这个点被访问了 vis[dx][dy] = 1; dfs(po); //函数回调 标记这个点已经无效 下次可以访问 vis[dx][dy] = 0; } } } //第一行N、M和T,N为行,M为列,T为障碍总数。 //第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。 public static void main(String args[]) { Scanner in = new Scanner(System.in); N = in.nextInt(); M = in .nextInt(); int T = in.nextInt(); vis = new int[N][M]; start = new point(); end = new point(); //-1 是为了和数组下表对应 start.x = in.nextInt()-1; start.y = in.nextInt()-1; end.x = in.nextInt()-1; end.y = in.nextInt()-1; zb = new point[T]; for(int i=0;i<T;i++){ point pi = new point(); pi.x = in.nextInt(); pi.y = in.nextInt(); zb[i] = pi; vis[(pi.x)-1][(pi.y)-1] = 2; } vis[start.x][start.y] = 1; dfs(start); System.out.println(ans); } } //自定义点类 class point{ int x; int y; public point(int a,int b){ x=a; y=b; } public point(){ } }
    Processed: 0.017, SQL: 9