查找所有可走的路径数java(dfs)

用dfs的方法

题目
马在中国象棋以日字形规则移动。

请编写一段程序,给定 n×m大小的棋盘,以及马的初始位置 (x,y)这里默认为(0,0),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入格式
第一行为整数 表示测试数据组数。每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标
输出格式
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次
 

import java.util.Scanner;

public class 马走日 {
    static int dx[]={2,1,2,-1,1,-1,-2,-2};
    static int dy[]={1,2,-1,2,-2,-2,-1,1};//经过分析,马有8种可能的步数方式
    static Scanner scanner=new Scanner(System.in);
    static int i=scanner.nextInt();
    static int j=scanner.nextInt();
    static int map[][]=new int[i][j];
    static int ant=0;

    public static void main(String[] args) {
        for(int i1=0;i1<i;i1++){
            for (int i2=0;i2<j;i2++){
                map[i1][i2]=0;//初始化未走的位置

            }
        }
      
dfs(0,0,0);//这里只以(0,0)为初始位置开始开始
        System.out.println(ant);
    }


    public static void  dfs(int i1,int j1,int setps){
        if(setps==j*i-1){//当此次steps达到走完全部的格子,就完成一次ant加一
            ant++;
        }
        map[i1][j1]=2;//表示标记已读
        for (int a=0;a<8;a++){
            int a1=dx[a]+i1;
            int b1=dy[a]+j1;//8次位置分别开始
            if(0<=a1 && a1<i && 0<=b1 &&b1<j && map[a1][b1]==0){
                
                dfs(a1,b1,setps+1);//满足未读,不出界等条件就进行下一次,步数加一
            }
        }
        map[i1][j1]=0;//当for遍历结束时会回溯并将map【i1】【j1】变为未读的0,不影响下次的计数

    }

}

补充,如果需要全部不同初始位置的总结果

for (int i1=0;i1<i;i1++){
            for (int j1=0;j1<j;j1++){
                dfs(i1,j1,0);//把所有位置初始都来一遍
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java实现深度优先搜索点到点的所有路径的示例代码: ``` import java.util.ArrayList; import java.util.List; public class DFS { private int[][] graph; private boolean[] visited; private List<List<Integer>> paths; public DFS(int[][] graph) { this.graph = graph; visited = new boolean[graph.length]; paths = new ArrayList<>(); } public List<List<Integer>> findAllPaths(int start, int end) { List<Integer> path = new ArrayList<>(); path.add(start); dfs(start, end, path); return paths; } private void dfs(int current, int end, List<Integer> path) { visited[current] = true; if (current == end) { paths.add(new ArrayList<>(path)); } else { for (int i = 0; i < graph[current].length; i++) { if (graph[current][i] == 1 && !visited[i]) { path.add(i); dfs(i, end, path); path.remove(path.size() - 1); } } } visited[current] = false; } } ``` 在这个示例中,我们使用一个二维组来表示图,其中组的第一维表示每个节点,第二维表示与该节点相邻的节点。如果两个节点之间有边相连,则组中相应位置的值为1,否则为0。我们还使用一个布尔组来跟踪每个节点是否已被访问过,以避免重复访问。 我们定义了一个`findAllPaths`方法来查找从起点到终点的所有路径。在该方法中,我们开始遍历从起点开始的所有可能路径,并将它们添加到路径列表中。我们使用一个递归函`dfs`来实现深度优先搜索。在该函中,我们首先将当前节点标记为已访问,然后遍历所有与该节点相邻的未访问节点。对于每个未访问节点,我们将其添加到当前路径中,并继续搜索从该节点开始的路径。如果该节点是终点,则将当前路径添加到路径列表中。最后,我们将当前节点标记为未访问,以允许在后续搜索中访问该节点。 在主程序中,我们可以使用以下代码来测试`DFS`类: ``` public static void main(String[] args) { int[][] graph = { {0, 1, 1, 0, 0}, {1, 0, 1, 1, 0}, {1, 1, 0, 1, 1}, {0, 1, 1, 0, 1}, {0, 0, 1, 1, 0} }; DFS dfs = new DFS(graph); List<List<Integer>> paths = dfs.findAllPaths(0, 4); for (List<Integer> path : paths) { System.out.println(path); } } ``` 在这个例子中,我们使用一个小的示例图来测试`DFS`类。我们将起点设置为0,终点设置为4,并查找从起点到终点的所有路径。我们将所有找到的路径打印到控制台上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值