八皇后问题——递归的应用

该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

正确的结果应该是92种,实现方法如下:

//八皇后问题
#include "stdafx.h"
#include<iostream>
#include<stdio.h>

int count = 0;

int notDanger(int row, int j, int(*chess)[8])
{
	int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
	//判断列方向
	for (i = 0; i<8; i++)
	{
		if (*(*(chess + i) + j) != 0)
		{
			flag1 = 1;
			break;
		}
	}
	//判断左上方
	for (i = row, k = j; i >= 0 && k >= 0; i--, k--)
	{
		if (*(*(chess + i) + k) != 0)
		{
			flag2 = 1;
			break;
		}
	}
	//判断右下方
	for (i = row, k = j; i<8 && k<8; i++, k++)
	{
		if (*(*(chess + i) + k) != 0)
		{
			flag3 = 1;
			break;
		}
	}
	//判断右上方
	for (i = row, k = j; i >= 0 && k<8; i--, k++)
	{
		if (*(*(chess + i) + k) != 0)
		{
			flag4 = 1;
			break;
		}
	}
	//判断左下方
	for (i = row, k = j; i<8 && k >= 0; i++, k--)
	{
		if (*(*(chess + i) + k) != 0)
		{
			flag5 = 1;
			break;
		}
	}
	if (flag1 || flag2 || flag3 || flag4 || flag5)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
//参数row表示起始行
//参数n表示列数,始终等于8
//(*chess)[8]表示指向棋盘每一行的指针
void EightQueen(int row, int n, int(*chess)[8])
{
	int chess2[8][8], i, j;
	for (i = 0; i<8; i++)
	{
		for (j = 0; j<8; j++)
		{
			chess2[i][j] = chess[i][j];
		}
	}
	//当达到第八行时,输出整个棋盘的元素
	if (8 == row)
	{
		printf("第%d种\n", count + 1);
			for (i = 0; i<8; i++)
			{
				for (j = 0; j<8; j++)
				{
					printf("%d", *(*(chess2 + i) + j));//输出棋盘每个位置处的值
				}
				printf("\n");
			}
		printf("\n");
		count++;
	}
	else//判断这个位置是否有危险,如果没有危险?继续往下
	{		
		for (j = 0; j<n; j++)
		{
			if (notDanger(row, j, chess))//判断是否有危险,1:没有危险
			{
				for (i = 0; i<8; i++)
				{
					*(*(chess2 + row) + i) = 0;
				}
				*(*(chess2 + row) + j) = 1;

				EightQueen(row + 1, n, chess2);
			}
		}
	}
}

int main()
{
	int chess[8][8], i, j;
	//将棋盘的每个位置赋初值0
	for (i = 0; i<8; i++)
	{
		for (j = 0; j<8; j++)
		{
			chess[i][j] = 0;
		}
	}
	//从第0行开始对8行分别检测
	EightQueen(0,8,chess);

	printf("总共有%d种解决方法!\n", count);

	return 0;
}
八皇后问题——递归的应用_第1张图片

你可能感兴趣的:(C++,八皇后)