骑士走棋盘

本文介绍了一种解决骑士周游问题的方法,采用递归加回溯的方式而非经典算法,虽然效率较低但易于理解。通过设定骑士的每一步可能移动方式,实现了从棋盘上的任意起点遍历所有格子并返回起始点的目标。

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

该算法没有参考经典的骑士走棋盘算法,而是采用普通的递归+回溯,因此效率比较低。

/******************************
作者:cncoderalex
博客:http://blog.youkuaiyun.com/cncoderalex
*******************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int N = 9;
int ChessBoard[N][N];
int StepX[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int StepY[] = {1, 2, 2, 1, -1, -2, -2, -1};

void Init()
{
	memset(ChessBoard, 0, sizeof(ChessBoard));
}

bool KnightGo(int x, int y, int index)
{
	ChessBoard[x][y] = index;
	if(64 == index)
	{
		return true;
	}
	for(int i = 0; i < 8; i++)
	{
		int NextX = x + StepX[i];
		int NextY = y + StepY[i];
		if(NextX >= 1 && NextX <= 8 && NextY >=1 && NextY <=8 && ChessBoard[NextX][NextY] == 0)
		{
			if(KnightGo(NextX, NextY, index + 1))
				return true;
		}
	}

	ChessBoard[x][y] = 0;
	return false;
}

void PrintChessBoard()
{
	printf("http://blog.youkuaiyun.com/cncoderalex");
	printf("\n\n");
	
	for(int i = 1; i <= 8; i++)
	{
		for(int j = 1; j <= 8; j++)
		{
			printf("%2d ", ChessBoard[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	Init();
	KnightGo(1, 1, 1);
	PrintChessBoard();
	system("pause");
	return 0;
}



本文地址:http://blog.youkuaiyun.com/cncoderalex/article/details/43227449   转载请标明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值