八皇后

八皇后


#include "stdio.h"
#include "stdlib.h"

#define QUEEN_COUNT 8

int resolve = 0;
int *queen;			/*记录每个皇后放置的列数,queen[0]=5表示第0个皇后放置在5列*/

void print_queen(int *queen)
{
	int i = 0;
	int j = 0;
	
	printf("----------------\n");
	for (int i = 0; i < QUEEN_COUNT; i++)
	{
		for (int j = 0; j < QUEEN_COUNT; j++)
		{
			if (queen[i] == j)
			{
				printf("1 ");
			}
			else
			{
				printf("0 ");
			}
		}
		printf("\n");
	}
}

/* 放置第q个皇后 */
/*
迭代流程(以5皇后为例):
放置第0个皇后
	放置第1个皇后
		放置第2个皇后
			放置第3个皇后
				放置第4个皇后(成功++)
			放置第3个皇后(一直失败)
		放置第2个皇后(失败)
	放置第1个皇后
		放置第2个皇后
			放置第3个皇后
				放置第4个皇后(成功++)
......

*/
int place(int q)
{
	int i = 0;	/* 试探列 */
	int j = 0;	/* 已经放置皇后的列 */
	int k = 0;	/* 对已经放置皇后探测的游标 */
	int valid = 0;	/* 位置是否合法 */


	for (i = 0; i < QUEEN_COUNT; i++)
	{
		printf("place queen %d %d ", q, i);
		queen[q] = i;	/* 第q个皇后放在第i列,皇后下标也表示第几行 */
		valid = 1;

		/* 检测放置位置是否合法,同一行(每一行新放置,不会出现在同行)、同一列、斜对角上没有其他皇后 */
		for (k = 0; k < q; k++)
		{
			if (queen[k] == queen[q] ||				/* 第k个皇后已经放在了当前试探列上 */
				(queen[q] - queen[k]) == (q - k) ||	/* 第k个皇后放在了试探列的左斜对角 */
				(queen[k] - queen[q]) == (q - k))	/* 第k个皇后放在了试探列的右斜对角 */
			{
				valid = 0;
			}
		}

		if (valid)	/* 第q个皇后可以放在第i个位置 */
		{
			printf("success\n");
			if (q == QUEEN_COUNT - 1)	/* 已经成功放置了第q个皇后 */
			{
				resolve++;
				print_queen(queen);
				return 0;
			}
			place(q + 1);
			//每次放置最后一个皇后成功,返回0,在上一次迭代的返回点,将第q个皇后放到下一个位置i+1
		}
		else
		{
			printf("failed\n");
			//每次放置失败返回点,将第q个皇后放到下一个位置i+1
		}
	}
}

int main()
{
	queen = malloc(sizeof(int) * QUEEN_COUNT);

	place(0);	/* 从第0个(行数)皇后开始放置 */
	printf("%d\r\n", resolve);

	free(queen);

    return 0;
}
上一篇:Python 解决八皇后问题


下一篇:css选择器基本属性