蓝桥杯刷题之路径之谜

题目来源

路径之谜
不愧是国赛的题目

题意

题目中会给你两个数组,分别用row和col来表示
在这里插入图片描述
每走一步,往左边和上边射一箭,走到终点的时候row数组和col数组中的值必须全部等于0这个注意哈,看题目看了半天,因为我第一次模拟的时候是只要找到一条到达重点的路径即可

思路

我用dfs来写的,模板就不写了,就说一下需要注意的点

  1. 到终点的时候,row和col必须全部等于0
  2. 起点的时候也要向上面和左边射一箭

代码 dfs

import java.util.*;

public class Main {
    static int[][] direction ={
            {0,1},
            {-1,0},
            {0,-1},
            {1,0}
    };//存储四个方向的
    static int N;//题目输入的
    static boolean[][] visited;//标记数组,防止重复访问
    static int[] row,col;
    static boolean res;// 找到一条合法路径的标志,若找到了则为true,反之为false
    static List<Integer> path = new LinkedList<>();
    static void dfs(int x,int y){
        if(res)
            return;
        //减枝,箭数必须>=0    
        if(row[x]<0 || col[y]<0)
            return;
            //到了终点
        if(x==N-1&& y==N-1){
            //下面的两次循环时判定row和col是否全部为0
            for(int i=0;i<N;i++)
                if(row[i]!=0)
                    return;
            for(int i=0;i<N;i++)
                if(col[i]!=0)
                    return;
            for(Integer num: path)
                System.out.print(num+" ");
            System.out.println();
            res=true;
            return;
        }

        visited[x][y]=true;
        for(int i=0;i<4;i++){
            int curX = x + direction[i][0];
            int curY = y + direction[i][1];
            if(curX>=0 && curX<N && curY>=0 && curY<N &&!visited[curX][curY]){

                visited[curX][curY] = true;
                row[curX]--;
                col[curY]--;
                
                path.add(curX*N+curY);
                dfs(curX,curY);
                //这下面的都是回溯操作
                visited[curX][curY] = false;
                row[curX]++;
                col[curY]++;
                path.remove(path.size()-1);
            }
        }

    }
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        N = s.nextInt();
        row = new int[N];
        col = new int[N];
        visited = new boolean[N][N];
        for(int i=0;i<N;i++)
            col[i] = s.nextInt();
        for(int j=0;j<N;j++)
            row[j] = s.nextInt();
        path.add(0);//0要加上哦
        // 起点也要向北和向左射一箭
        row[0]--;
        col[0]--;
        dfs(0,0);
        s.close();
    }
}

代码 bfs

这个有点思路,吃完饭再写

相关推荐

  1. 记录王国

    2024-03-27 19:12:03       21 阅读
  2. 记录质数

    2024-03-27 19:12:03       11 阅读
  3. 记录数字王国军训排队

    2024-03-27 19:12:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-27 19:12:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-27 19:12:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-27 19:12:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-27 19:12:03       18 阅读

热门阅读

  1. 内存泄漏导致Hard_Fault问题记录

    2024-03-27 19:12:03       18 阅读
  2. Tomcat 启动闪退问题解决方法

    2024-03-27 19:12:03       17 阅读
  3. springboot结合mongodb使用(一)

    2024-03-27 19:12:03       15 阅读
  4. python type()用法

    2024-03-27 19:12:03       14 阅读
  5. 读3dsr代码②训练

    2024-03-27 19:12:03       15 阅读
  6. Android 连接USB弹窗出来USB相关选项

    2024-03-27 19:12:03       15 阅读
  7. Python教程:深入探索 Python 列表(List)

    2024-03-27 19:12:03       15 阅读
  8. linux常用命令

    2024-03-27 19:12:03       14 阅读