马踏棋盘问题

 

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

81
72
63
54

输入格式:

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

输出格式:

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

输入样例1:

1 1

输出样例1:

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

输入样例2:

4 1

输出样例2:

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

代码长度限制16 KB

时间限制4000 ms

内存限制64 MB

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define M 8
int t = 0;
int fun(int** arr, int i, int j) {
	if (i < 0 || i > M - 1 || j < 0 || j > M - 1 || arr[i][j] != 0) return 0;
	arr[i][j] = ++t;
	if (t == pow(M, 2)) return 1;
	if (fun(arr, i - 2, j + 1) || t == pow(M, 2)) return 1;
	if (fun(arr, i - 1, j + 2) || t == pow(M, 2)) return 1;
	if (fun(arr, i + 1, j + 2) || t == pow(M, 2)) return 1;
	if (fun(arr, i + 2, j + 1) || t == pow(M, 2)) return 1;
	if (fun(arr, i + 2, j - 1) || t == pow(M, 2)) return 1;
	if (fun(arr, i + 1, j - 2) || t == pow(M, 2)) return 1;
	if (fun(arr, i - 1, j - 2) || t == pow(M, 2)) return 1;
	if (fun(arr, i - 2, j - 1)) return 1;
	arr[i][j] = 0, t--;
	return 0;
}
int main() {
	int m = 0, n = 0;
	scanf("%d %d", &m, &n);
	int** arr = (int**)malloc(sizeof(int*) * M);
	for (int i = 0; i < M; i++) arr[i] = (int*)malloc(sizeof(int) * M);
	for (int i = 0; i < M; i++)
		for (int j = 0; j < M; j++)
			arr[i][j] = 0;
	if (fun(arr, m - 1, n - 1)) {
		for (int i = 0; i < M; i++) {
			for (int j = 0; j < M; j++)
				printf("%2d ", arr[i][j]);
			printf("\n");
		}
	}
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云儿乱飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值