首页 > 其他 > 详细

17八皇后问题

时间:2015-03-23 23:40:36      阅读:337      评论:0      收藏:0      [点我收藏+]
递归回溯法解决八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵列或斜线上。如图:

技术分享

1)从第一行开始,为皇后找到安全位置|y1-y2| != |x1-x2| ,然后跳到下一行
2)如果在第n行出现死胡同,如果该行为第一行,棋局失败,否则后退到上一行,在进行回溯
3)如果在第8行上找到了安全位置,则棋局成功。
程序如下:
#include <stdio.h>

#define QUEEN_NUM 8
int queen[QUEEN_NUM];

// 在第y行上放置皇后
void place(int y);
// 检测在第y行第x列能否放置皇后
int check(int y, int x);
void show();

int main(void)
{
	place(0);
	return 0;
}

int check(int y, int x)
{
	int i;
	for (i=0; i<y; i++)
	{
		if (queen[i] == x || y - i == abs(x - queen[i]))
			return 0;
	}

	return 1;
}

void show()
{
	int i;
	int j;
	static int count = 0;
	printf("第%d个解\n", ++count);
	for (i=0; i<QUEEN_NUM; i++)
	{
		printf("(%d, %d) ", i, queen[i]);
	}
	putchar(‘\n‘);

	for (i=0; i<QUEEN_NUM; i++)		// 行
	{
		for (j=0; j<QUEEN_NUM; j++)	// 列
		{
			if (queen[i] == j)
				printf("Q ");
			else
				printf("x ");
		}
		putchar(‘\n‘);
	}
}

void place(int y)
{
	if (y == 8)
	{
		show();
		return;
	}

	int i;
	for (i=0; i<QUEEN_NUM; i++)	// 在第y行的每一列上试探
	{
		if (check(y, i))
		{
			queen[y] = i;
			place(y+1);	// 在下一行放置皇后
		}
	}

	
}

  

17八皇后问题

原文:http://www.cnblogs.com/DamonBlog/p/4361280.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!