m0_73292724 2022-10-25 16:36 采纳率: 91.7%
浏览 20
已结题

马走日不知哪里出错了

问题遇到的现象和发生背景

马走日不知哪里出错了,求指点出错误,不要直接给答案代码,感谢
8465:马走日
查看提交统计提问
总时间限制: 1000ms 内存限制: 65536kB
描述
马在中国象棋以日字形规则移动。

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

输入
第一行为整数T(T < 10),表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)
输出
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次
样例输入
1
5 4 0 0
样例输出
32

用代码块功能插入代码,请勿粘贴截图

#include <stdio.h>
#include <string.h>
int vis[11][11]={0};
int n,m,cnt;
int dx[]={1,1,-1,-1,2,2,-2,-2};
int dy[]={2,-2,2,-2,1,-1,1,-1};
void dfs(int x,int y,int dep) {
    printf("%d %d %d\n",x,y,dep);
    if(dep==n*m){
        cnt++;
        return ;
    }
    int i;
    for(i=0;i<8;i++){
        int bx=x+dx[i],by=y+dy[i];
        if(bx<0||bx>=n||by<0||by>=m)continue;
        if(vis[bx][by])continue;
        vis[bx][by]=1;
        dfs(bx,by,dep+1);
        vis[bx][by]=0;
    }
}
int main()
{
    int t,x,y;
    scanf("%d",&t) ;
    while(t--){
        scanf("%d%d%d%d",&n,&m,&x,&y);
        cnt=0;
        memset(vis,0,sizeof(vis)) ;
        vis[x][y]=1;
        dfs(x,y,0);
        printf("%d\n",cnt);
    }
    
    return  0;
    
}
  • 写回答

2条回答 默认 最新

  • honestman_ 2022-10-25 16:49
    关注
    
    import java.util.Scanner;
    
    public class Main {
        static boolean[][] vis;  // 标记数组
        static int[] orient = {-1, 2, 1, -2, -1, -2, 1, 2, -1};  // 8个方向
        static int sum, n, m;
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int t = sc.nextInt();
            while (t-- > 0) {
                // 矩阵图大小
                n = sc.nextInt();
                m = sc.nextInt();
                // 初始化标记数组,默认false
                vis = new boolean[n][m];
                // 获取起点坐标
                int x = sc.nextInt();
                int y = sc.nextInt();
                // 初始化,方案总数
                sum = 0;
                // 标记起点位置已经访问
                vis[x][y] = true;
                // 深度优先搜索:Go!
                dfs(x, y, 1);
                // 打印结果
                System.out.println(sum);
            }
        }
        public static void dfs(int x, int y, int curSum) {
            // 如果遍历完全部点,方案数 sum++,递归终止条件
            if (curSum == (n * m)) {
                sum++;
                return;
            }
            // 递归8个方向
            for (int i = 0; i < 8; i++) {
                // 获取可以到达的新方向
                int u = x + orient[i];
                int v = y + orient[i+1];
                // 剪枝条件,避免无效递归
                if (u < 0 || u >= n || v < 0 || v >= m || vis[u][v])
                    continue;
                // 标记当前位置已访问
                vis[u][v] = true;
                // 继续往深处递归
                dfs(u, v, curSum+1);
                // 回溯
                vis[u][v] = false;
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 已采纳回答 10月25日
  • 专家修改了标签 10月25日
  • 创建了问题 10月25日

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)