马踏棋盘问题(贪心算法实现C++)

该博客详细介绍了马在8x8棋盘上按照'日'字形移动的算法实现过程。首先,随机初始化马的位置,然后通过遍历马可跳跃的8个相邻位置,并计算每个位置下一步的可跳跃点数,选择最少的路径进行移动。在每一步移动后,更新棋盘状态并输出马的位置。程序持续运行直至无法找到可移动的点为止,输出了马的完整行驶路径。
摘要由CSDN通过智能技术生成

算法实现流程:

步骤1初始化马的位置(结构体horse {x, y})

步骤2:确定马从当前点出发,可跳跃的附近8个点,以结构体Jump数组给出,但需判断当前给出的附近8个点是否曾经访问过,或者是否这8个点超出棋盘尺寸。

步骤3:跟据步骤2确定跳跃的点,分别计算可跳跃点的下下一步,可跳跃点的个数。并选出下下步可跳跃点数最少的点作为马下一步跳跃的点。(举例说明:马当前所在点坐标(4,4),下一步可跳跃点有(5,2),(6,3),且(5,2)下一步可跳跃点有3个,(6,3)下一步可跳跃点2个;3 > 2这个时候,选择下下一跳小的点进行跳跃,则马下一跳为(6,3))

流程图:

        

#pragma once
#include <iostream>
#include <math.h>
using namespace std;
#define SAFE_DELETE(x) if (x != NULL) {delete(x); x = NULL;}
#define SAFE_DELETE_ARR(x) if (x != NULL) {delete[](x); x = NULL;}
#define PRING_ARR(title, arr, n) {cout << title << " "; for (int i=0; i<n; i++) {cout << arr[i] << " ";} cout << endl;}

#define INF 9999999

typedef struct
{
	int x;
	int y;
}Location;

typedef struct
{
	int delx;
	int dely;
}Jump;

class HorseRun
{
private:
	int** altas;
	int N; //棋盘的宽
	Location horse; //马当前的位置
public:
	HorseRun()
	{
		N = 8;
		altas = new int* [N]();
		for (int j = 0; j < N; j++)
		{
			altas[j] = new int[N]();
			memset(altas[j], 0, sizeof(int) * N);
		}

		//随机生成马的初始位置
		horse = { rand() % N, rand() % N };
		altas[horse.x][horse.y] = 1;
		cout << "马初始位置:" << "(" << horse.x << "," << horse.y << ")" << endl;

		Visit();
	}

	~HorseRun()
	{
		for (int i = 0; i < N; i++)
			SAFE_DELETE_ARR(altas[i]);
		SAFE_DELETE_ARR(altas);
	}

	inline void Visit()
	{
		Jump jump[8] = { {1,-2}, {2, -1}, {2, 1}, {1, 2}, {-1, 2}, {-2, 1}, {-2, -1}, {-1, -2} };

		int max_visit = 63;
		int forward_x, forward_y, forward_xx, forward_yy, w_cnt, min_cnt, tmp_run_x, tmp_run_y;
		while (max_visit-- > 0)
		{
			min_cnt = INF;
			//棋子可跳八个方位
			for (int i = 0; i < 8; i++)
			{
				forward_x = horse.x + jump[i].delx;
				forward_y = horse.y + jump[i].dely;

				//判断这两个坐标是否有效
				if (forward_x < 0 || forward_x >= N || forward_y < 0 || forward_y >= N || altas[forward_x][forward_y] == 1)
					continue;

				w_cnt = 0;
				for (int j = 0; j < 8; j++)
				{
					forward_xx = forward_x + jump[j].delx;
					forward_yy = forward_y + jump[j].dely;

					if (forward_xx < 0 || forward_xx >= N || forward_yy < 0 || forward_yy >= N || altas[forward_xx][forward_yy] == 1)
						continue;
					w_cnt++;
				}

				if (min_cnt > w_cnt)
				{
					min_cnt = w_cnt;
					tmp_run_x = forward_x;
					tmp_run_y = forward_y;
				}
			}

			//棋子移动判断
			if (min_cnt == INF)
			{
				cout << "没有找到可以移动的地方" << endl;
				break;
			}
			else
			{
				horse.x = tmp_run_x;
				horse.y = tmp_run_y;
				altas[tmp_run_x][tmp_run_y] = 1;
				cout <<"第"<< 63 - max_visit << "步," << "棋子当前移动到:" << "(" << tmp_run_x << ", " << tmp_run_y << ")" << endl;
			}
		}
	}
};

#define  _CRT_SECURE_NO_WARNINGS true
#include "HorseRun.h"
int main()
{
	HorseRun app;
	return 0;
}

运行结果输出1-63步马行驶的具体路径信息:

中间还有很多输出省略。。。

 

贪心算法是一种常见的算法思想,它在求解最优化问题时,每一步都选择当前看起来最优的解决方案,而不考虑全局最优解。对于五子棋这个游戏,贪心算法可以用来制定AI的策略。 在五子棋中,贪心算法可以通过评估当前局面的得分来选择下一步的落子位置。常见的评估方法是通过计算每个位置的连续棋子数来判断该位置的得分,然后选择得分最高的位置进行落子。 以下是一个简单的贪心算法五子棋的C++实现示例: ```cpp #include <iostream> #include <vector> using namespace std; const int SIZE = 15; // 棋盘大小 // 评估函数,计算某个位置的得分 int evaluate(vector<vector<int>>& board, int row, int col, int player) { int score = 0; int dx = {1, 0, 1, 1}; int dy[4] = {0, 1, 1, -1}; for (int i = 0; i < 4; i++) { int count = 0; int x = row, y = col; while (x >= 0 && x < SIZE && y >= 0 && y < SIZE && board[x][y] == player) { count++; x += dx[i]; y += dy[i]; } score += count; } return score; } // 贪心算法,选择得分最高的位置进行落子 void greedyAlgorithm(vector<vector<int>>& board, int player) { int maxScore = 0; int bestRow = -1, bestCol = -1; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == 0) { int score = evaluate(board, i, j, player); if (score > maxScore) { maxScore = score; bestRow = i; bestCol = j; } } } } board[bestRow][bestCol] = player; } int main() { vector<vector<int>> board(SIZE, vector<int>(SIZE, 0)); // 初始化棋盘 // 玩家1先手落子 int player1 = 1; int row1, col1; cout << "玩家1,请输入落子位置(行 列):"; cin >> row1 >> col1; board[row1][col1] = player1; // AI玩家2贪心算法落子 int player2 = 2; greedyAlgorithm(board, player2); // 输出当前棋盘状态 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << board[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码实现了一个简单的贪心算法五子棋的对战,玩家1先手输入落子位置,然后AI玩家2使用贪心算法选择最优位置进行落子,最后输出当前棋盘状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值