Thắc mắc về hàm di chuyển của bài toán mã đi tuần

Em có hàm void Di(int x_m, int y_m, int n) của quân mã của bài toán mã đi tuần mà không hiểu công thức trong code lắm, mong mn giải thích chi tiết giúp em với ạ.

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<cmath>
#include<windows.h>
using namespace std;
const int kichthuoc = 5;
int KhungCo[kichthuoc + 1][kichthuoc + 1];
// int x[8] = {2,2,1,-1,-2,-2,-1,1};  // Di nguoc chieu kim dong ho.
// int y[8] = {1,-1,-2,-2,-1,1,2,2};
int x[8] = { 2,1,-1,-2,-2,-1,1,2 }; // Di theo chieu kim dong ho.
int y[8] = { 1,2,2,1,-1,-2,-2,-1 };
bool thang = FALSE;
void gotoxy(int x, int y) // di chuyen den cot a hang b
{
	static HANDLE h = NULL;
	if (!h)
		h = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD c = { x, y };
	SetConsoleCursorPosition(h, c);
};
void Di(int x_m, int y_m, int n) {
	int x_t, y_t;
	for (int i = 0; i <= 7; i++) {
		x_t = x_m + x[i];
		y_t = y_m + y[i];
		if (0 < x_t && x_t <= kichthuoc && 0 < y_t && y_t <= kichthuoc && KhungCo[x_t][y_t] == 0) // Neu ô cờ chưa di và ô đó hợp lệ 
		{
			KhungCo[x_t][y_t] = n;
			gotoxy(5 + x_t * 4, 3 + y_t * 2);
			Sleep(0); 
			cout << n;
			gotoxy(6 + n * 3, 10 + kichthuoc * 2);
			cout << n;
			if (n == kichthuoc * kichthuoc) {
				thang = TRUE;
				putchar(7);
			}
			if (thang == FALSE)
				Di(x_t, y_t, n + 1);
			if (thang == TRUE)
				return;
			KhungCo[x_t][y_t] = 0;
			gotoxy(5 + x_t * 4, 3 + y_t * 2);
			Sleep(100);  cout << "   ";
			gotoxy(6 + n * 3, 10 + kichthuoc * 2);
			cout << "   ";
		}
	}
};
int main() {
	int x_chon, y_chon;
	cout << "thuat toan quay lui \n";
	cout << "\n Moi ban nhap vi tri xuat phat x - y : ";  cin >> x_chon >> y_chon;
	if (x_chon < 1 || x_chon > kichthuoc)
		x_chon = 1;
	if (y_chon < 1 || y_chon > kichthuoc)
		y_chon = 1;
	gotoxy(4, 4);
	cout << "\t+---+---+---+---+---+ \n";
	cout << "\t|   |   |   |   |   | \n";
	cout << "\t+---+---+---+---+---+ \n";
	cout << "\t|   |   |   |   |   | \n";
	cout << "\t+---+---+---+---+---+ \n";
	cout << "\t|   |   |   |   |   | \n";
	cout << "\t+---+---+---+---+---+ \n";
	cout << "\t|   |   |   |   |   | \n";
	cout << "\t+---+---+---+---+---+ \n";
	cout << "\t|   |   |   |   |   | \n";
	cout << "\t+---+---+---+---+---+ \n";
	gotoxy(0, 10 + kichthuoc * 2);
	cout << "Buoc di :";
	Di(x_chon - 2, y_chon - 1, 1);
	gotoxy(0, 5 + kichthuoc * 2);
	if (thang == TRUE)
		cout << "Thanh cong !";
	else
		cout << "Khong co loi giai.";
	return 1;
};

Cách dễ nhất là lấy giấy bìa ra kẻ bàn cờ (có hàng x cột tương ứng với code trên 8x8 thì phải) rồi lấy một nắp chai (nếu không có quân cờ) làm con mã và đi thử, mỗi bước con mã đi, lấy bút chì đánh dấu x vào đó. Rồi nhìn cái đó với bài code trên là hiểu. Nhớ đánh dấu dòng và cột bàn cờ để xác định tọa độ của ô, để biết con mã đi tuần qua những ô nào. Code khá trừu tượng nên bạn đọc không hiểu nổi (trừ khi bạn từng có giải học sinh giỏi toán quốc gia) nếu không có bàn cờ trực quan ngay trước mặt.

Nếu thuộc loại lười, nhưng phải nghe được tiếng Anh, xem cái này https://www.youtube.com/watch?v=pwlxQeHchFQ hoặc (dễ nghe hơn) https://www.youtube.com/watch?v=OrS7PaJ-5ck

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?