八皇后问题

#include <stdio.h>
#include <stdlib.h>

char	Chessboard[8][8];	/* 声明8*8的空白棋盘	*/

/* ---------------------------------------------------*/
/* 递归解N皇后问题                                                                   */
/* ---------------------------------------------------*/
int N_Queens(int LocX,int LocY,int Queens)
{
	int	i,j;			/* 循环计数变量	*/
	int	Result=0;

	if ( Queens == 8 )    /* 递归结束条件 */
		return 1;
	else				/* 递归执行部分 */
		if ( QueenPlace(LocX,LocY) )
		{
			Chessboard[LocX][LocY] = 'Q';
			for (i=0;i<8;i++)               //针对每一行
				for (j=0;j<8;j++)           //一行中的各个位置进行判断
				{
					Result += N_Queens(i,j,Queens+1);
					if (Result > 0)
						break;
				}
			if (Result > 0)        
				return 1;
			else                       //上述循环后result=0,就不是break跳出的
			{
				Chessboard[LocX][LocY] = 'X';
				return 0;
			}
		}
		else
			return 0;
}

/* --------------------------------------------------- */
/* 判断传入坐标是否可放置皇后                                                       */
/* --------------------------------------------------- */
int QueenPlace(int LocX,int LocY)
{
	int	i,j;

	if (Chessboard[LocX][LocY] != 'X')	/* 判断是否有皇后	*/
		return 0;

    for (j=LocY-1;j>=0;j--)			/* 判断上方是否有皇后	*/
		if (Chessboard[LocX][j] != 'X')
			return 0;

	for (j=LocY+1;j<8;j++)			/* 判断下方是否有皇后	*/
		if (Chessboard[LocX][j] != 'X')
			return 0;

    for (i=LocX-1;i>=0;i--)			/* 判断左方是否有皇后	*/
		if (Chessboard[i][LocY] != 'X')
			return 0;

	for (i=LocX+1;i<8;i++)			/* 判断右方是否有皇后	*/
		if (Chessboard[i][LocY] != 'X')
			return 0;

	i = LocX - 1;
	j = LocY - 1;
	while ( i>=0 && j>=0 )			/* 判断左上方是否有皇后	*/
		if (Chessboard[i--][j--] != 'X')
			return 0;

	i = LocX + 1;
	j = LocY - 1;
	while ( i<8 && j>=0 )			/* 判断右上方是否有皇后	*/
		if (Chessboard[i++][j--] != 'X')
			return 0;

	i = LocX - 1;
	j = LocY + 1;
	while ( i>=0 && j<8 )			/* 判断左下方是否有皇后	*/
		if (Chessboard[i--][j++] != 'X')
			return 0;

	i = LocX + 1;
	j = LocY + 1;
	while ( i<8 && j<8 )			/* 判断右下方是否有皇后	*/
		if (Chessboard[i++][j++] != 'X')
			return 0;
	return 1;
}

/* --------------------------------------------------- */
/* 主程序                                                                                     */
/* --------------------------------------------------- */
void main ()
{
	int	i,j;			/* 循环计数变量	*/

	for (i=0;i<8;i++)
		for (j=0;j<8;j++)
			Chessboard[i][j] = 'X';
	N_Queens(0,0,0);

	printf("The graph of 8 Queens on the Chessboard.\n");
	printf("      0   1   2   3   4   5   6   7  \n");
	printf("    +---+---+---+---+---+---+---+---+\n");

	for (i=0;i<8;i++)
	{
		printf("  %d |",i);
		for (j=0;j<8;j++)
			printf("-%c-|",Chessboard[i][j]);
		printf("\n    +---+---+---+---+---+---+---+---+\n");
	}
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值