• 马踏棋盘问题


     

    将马放入国际象棋8×8棋盘的制定的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格。求出马的行走路线,并按求出的行走路线将数字1,2,…,64依次填入一个8×8的方阵并输出。
    特别规定,马的8个探索方向如下图所示的1至8的顺序探索。

    81
    72
    63
    54

    输入格式:

    输入两个整数 m 和n(空格间隔),表示起始行列号。

    输出格式:

    以矩阵形式将8×8棋盘中的路线输出。
    每个数自占两个字符的宽度(不足两位时,右对齐),每个数后面空一格。

    输入样例1:

    1 1
    

    输出样例1:

    1. 1 38 55 34 3 36 19 22
    2. 54 47 2 37 20 23 4 17
    3. 39 56 33 46 35 18 21 10
    4. 48 53 40 57 24 11 16 5
    5. 59 32 45 52 41 26 9 12
    6. 44 49 58 25 62 15 6 27
    7. 31 60 51 42 29 8 13 64
    8. 50 43 30 61 14 63 28 7

    输入样例2:

    4 1
    

    输出样例2:

    1. 38 49 56 3 30 41 14 5
    2. 57 2 39 42 55 4 31 12
    3. 50 37 48 29 40 13 6 15
    4. 1 58 43 54 27 32 11 20
    5. 36 51 28 47 62 21 16 7
    6. 59 44 53 26 33 10 19 22
    7. 52 35 46 61 24 63 8 17
    8. 45 60 25 34 9 18 23 64

    代码长度限制16 KB

    时间限制4000 ms

    内存限制64 MB

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<math.h>
    4. #define M 8
    5. int t = 0;
    6. int fun(int** arr, int i, int j) {
    7. if (i < 0 || i > M - 1 || j < 0 || j > M - 1 || arr[i][j] != 0) return 0;
    8. arr[i][j] = ++t;
    9. if (t == pow(M, 2)) return 1;
    10. if (fun(arr, i - 2, j + 1) || t == pow(M, 2)) return 1;
    11. if (fun(arr, i - 1, j + 2) || t == pow(M, 2)) return 1;
    12. if (fun(arr, i + 1, j + 2) || t == pow(M, 2)) return 1;
    13. if (fun(arr, i + 2, j + 1) || t == pow(M, 2)) return 1;
    14. if (fun(arr, i + 2, j - 1) || t == pow(M, 2)) return 1;
    15. if (fun(arr, i + 1, j - 2) || t == pow(M, 2)) return 1;
    16. if (fun(arr, i - 1, j - 2) || t == pow(M, 2)) return 1;
    17. if (fun(arr, i - 2, j - 1)) return 1;
    18. arr[i][j] = 0, t--;
    19. return 0;
    20. }
    21. int main() {
    22. int m = 0, n = 0;
    23. scanf("%d %d", &m, &n);
    24. int** arr = (int**)malloc(sizeof(int*) * M);
    25. for (int i = 0; i < M; i++) arr[i] = (int*)malloc(sizeof(int) * M);
    26. for (int i = 0; i < M; i++)
    27. for (int j = 0; j < M; j++)
    28. arr[i][j] = 0;
    29. if (fun(arr, m - 1, n - 1)) {
    30. for (int i = 0; i < M; i++) {
    31. for (int j = 0; j < M; j++)
    32. printf("%2d ", arr[i][j]);
    33. printf("\n");
    34. }
    35. }
    36. return 0;
    37. }

  • 相关阅读:
    Os-ByteSec
    find、findindex、indexof的区别
    mongodb 分片集群认证
    Web前端开发技术课程大作业,期末考试HTML+CSS+JavaScript电竞游戏介绍网站
    记录窗体关闭位置(从窗体上次关闭的位置启动窗体)
    51.【结构体初始化的两种方法】
    一篇文章教会你利用红黑树实现map和set的封装
    流量分析三—远程登陆
    Redis 教程 - 主从复制
    CISCO设备信息泄漏漏洞案例
  • 原文地址:https://blog.csdn.net/Mz_yuner/article/details/133364416