分治法解棋盘问题的C++实现

说明:假设你已经完全搞懂了原理,目的旨在帮助用C++实现有困难的同学。

#include "pch.h"
#include <iostream>
#include <iomanip>
#define boa_size 8
#define b_x 3
#define b_y 3
using namespace std;
void defective_chessboard(int x, int y, int board_size, int begin_x, int begin_y, int **p)
{
	static int step = 1;
	if (board_size != 1)
	{
		board_size /= 2;
		if ((x <begin_x + board_size) && (y <begin_y + board_size))//左上角
		{
			++step;
			p[board_size + begin_x - 1][board_size + begin_y] = p[board_size + begin_x][board_size + begin_y] = p[board_size + begin_x][board_size + begin_y - 1] = step;
			defective_chessboard(x, y, board_size, begin_x, begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y-1, board_size, begin_x + board_size, begin_y, p);//左下
			defective_chessboard(board_size + begin_x, board_size + begin_y, board_size, begin_x + board_size, board_size + begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y - 1, board_size, begin_x, begin_y + board_size, p);
		}
		else if ((x >=begin_x + board_size) && (y <begin_y + board_size))//左下角
		{
			++step;
			p[board_size + begin_x - 1][board_size + begin_y] = p[board_size + begin_x][board_size + begin_y] = p[board_size + begin_x - 1][board_size + begin_y - 1] = step;
			defective_chessboard(x, y, board_size, begin_x + board_size, begin_y, p);
			defective_chessboard(board_size + begin_x - 1, board_size + begin_y - 1, board_size, begin_x, begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y, board_size, begin_x + board_size, board_size + begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y - 1, board_size, begin_x, begin_y + board_size, p);
		}
		else if ((x <begin_x + board_size) && (y >=begin_y + board_size))//右上角
		{
			++step;
			p[board_size + begin_x][board_size + begin_y-1] = p[board_size + begin_x][board_size + begin_y] = p[board_size + begin_x - 1][board_size + begin_y - 1] = step;
			defective_chessboard(x, y, board_size, begin_x, begin_y + board_size, p);
			defective_chessboard(board_size + begin_x - 1, board_size + begin_y, board_size, begin_x + board_size, begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y, board_size, begin_x + board_size, board_size + begin_y, p);
			defective_chessboard(board_size + begin_x - 1, board_size + begin_y - 1, board_size, begin_x, begin_y, p);
		}
		else//右下角
		{
			++step;
			p[board_size + begin_x - 1][board_size + begin_y] = p[board_size + begin_x - 1][board_size + begin_y - 1] = p[board_size + begin_x][board_size + begin_y - 1] = step;
			defective_chessboard(x, y, board_size, begin_x + board_size, begin_y + board_size, p);
			defective_chessboard(board_size + begin_x - 1, board_size + begin_y, board_size, begin_x + board_size, begin_y, p);
			defective_chessboard(board_size + begin_x - 1, board_size + begin_y - 1, board_size, begin_x, begin_y, p);
			defective_chessboard(board_size + begin_x, board_size + begin_y - 1, board_size, begin_x, begin_y + board_size, p);
		}
	}
}
int main()
{
	int **p;
	p = new int*[boa_size+1];
	for (int i = 1; i <= boa_size; ++i)
		p[i] = new int[boa_size+1];
	for (int i = 1; i <= boa_size; ++i)
		for (int j = 1; j <= boa_size; ++j)
			p[i][j] = 0;
	p[b_x][b_y] = 1;
	defective_chessboard(b_x, b_y, boa_size, 1, 1, p);
	for (int i = 1; i <= boa_size; ++i)
	{
		for (int j = 1; j <= boa_size; ++j)
		{
			cout << p[i][j];
			if (p[i][j] < 10)
				cout << "  ";
			else
				cout << " ";
		}
		cout << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值