数据结构与算法笔记 lesson 16 八皇后问题

八皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

 

#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;
	//判断列方向 如果该列有皇后,则某个列的横坐标为1
	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:表示列数   (*chess)[8]: 表示指向棋盘每一行的指针  
void EightQueen(int row, int n, int(*chess)[8])
{
	int chess2[8][8], i, j;
	for (i = 0; i < 0; 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));//chess[i][j]
			}
			printf("\n");
		}
		printf("\n");
		count++;
	}
	else
	{
		for (j = 0; j < n; j++)
		{
			if (notDanger(row,j,chess)) //判断是否危险
			{
				//如果不危险,摆放皇后
				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;
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			chess[i][j] = 0;
		}
	}
	EightQueen(0,8,chess);
	printf("总共有%d种\n", count);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值