马走日问题,在5*5的棋盘中,马只能走日字。马从位置(0,0)处出发,把棋盘的每一格都走一次,且只走一次。找出所有路径。(C语言实现)

#include <stdio.h>
#include <windows.h>
#include <math.h>

#pragma warning(disable:4996)

#define N (5 * 5)//棋盘大小5 * 5

int row[N] = { 0 };//存放行标
int col[N] = { 0 };//存放列标,意思是从(1,1)开始走
int num = 0;//一共有多少种方法

void print()
{
	int i = 0;
	int a, b;//因为C语言采用的是就近原则,所以这里不用row和col代表行和列,避免产生歧义
	int arr[5][5] = { 0 };
	for (i = 0; i < N; i++){//把每个坐标的步数写入二位数组,打印时方便观察
		a = row[i];
		b = col[i];
		arr[a][b] = i + 1;
		//arr[row[i]][col[i]] = i + 1;//也可以直接这样写
	}
	for (a = 0; a < 5; a++){
		for (b = 0; b < 5; b++){
			printf("%2d ", arr[a][b]);
		}
		printf("\n");
	}
	printf("\n");
}

int check(int n)
{
	int i = 0;
	if ((abs(row[n] - row[n - 1]) == 2 && abs(col[n] - col[n - 1]) == 1) || \
		(abs(row[n] - row[n - 1]) == 1 && abs(col[n] - col[n - 1]) == 2)){//判断是否走日
		for (i = 0; i < n; i++){
			if (row[i] == row[n] && col[i] == col[n]){
				return 0;//重复走则返回0
			}
		}
	}
	else{
		return 0;//不走日则返回0
	}
	return 1;//走日且不重复则返回1
}

void put(int n)
{
	int i = 0;
	int j = 0;
	if (n < N){
		for (i = 0; i < 5; i++){
			row[n] = i;
			for (j = 0; j < 5; j++){
				col[n] = j;
				if (check(n)){
					put(n + 1);//合适的话走下一步
				}
			}
		}
	}
	else{
		num++;
		print();//打印出每种方法
	}
}

int main()
{
	put(1);//从第二步开始,put(0)是第一步
	printf("一共有%d种方法\n", num);
	system("pause");
	return 0;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值