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

本文探讨了如何使用深度优先搜索(DFS)算法解决中国象棋中马的移动问题,计算给定棋盘上马从任意初始位置出发的遍历途径数量,并提供了完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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);//把所有位置初始都来一遍
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值