八皇后问题是个古老而著名的问题,时回溯算法的典型例题。要在8x8的国际象棋棋盘,安放八个皇后,要求任意两个皇后不能处于同一行、同一列或同一对角线上。

内容:

        八皇后问题是个古老而著名的问题,时回溯算法的典型例题。要在8x8的国际象棋棋盘,安放八个皇后,要求任意两个皇后不能处于同一行、同一列或同一对角线上。

算法分析

        本题要完成的是将十进制整数num转化为r进制数,其转换方法为辗转相除法,要求用到链栈结构。程序设计中要用到栈的基本操作,分别用不同的函数分别来实现栈的入栈,判断栈空和出栈操作。主函数有两个输入,即输入待转化的数和要转化的进制,函数Convert算法思想为:对待转换的数先判断正负,用判断语句分别实现正数与负数的转化。具体转化的方法为辗转相除法,然后将所得到的数字放入栈中,通过栈的先进后出原则输出即可得到进制转换的结果

概要设计

函数

函数Check(int row,int column) int

函数Output() void

函数EightQueen(int row) void

代码

#include<stdio.h>
#include<stdlib.h>
#define ture 1;
#define false 0;
int num = 0;//解数目
char  m[8][8] = { '*' };//m[8][8],表示棋盘,初始为*,表示未放置皇后
int Check(int row, int column)
{
	int i, j;
	if (row == 1)
		return ture;
	for (i = 0; i <= row - 2; i++)//纵向只能有一枚皇后
	{
		if (m[i][column - 1] == 'Q')return false;
	}
	//左上至右下只能有一枚皇后
	i = row - 2;//相邻上一个左上横坐标
	j = i - (row - column);//左上纵坐标
	while (i >= 0 && j >= 0)
	{
		if (m[i][j] == 'Q')
			return false;
		i--;
		j--;
	}
	//右上至左下只能有一枚皇后
	i = row - 2;
	j = row + column - i - 2;
	while (i >= 0 && j <= 7)
	{
		if (m[i][j] == 'Q')
			return false;
		//向右上方移动判断位置
		i--;
		j++;
	}
	return ture;
}
void Output()//当已经放置8皇后以后,则为可行解,输出棋盘。
{
	int i, j;
	num++;
	printf("可行解 %d:\n",num);
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			printf("%c", m[i][j]);//输出八皇后
		}
		printf("\n");
	}
}
void EightQueen(int row)
{
	int j;
	for (j = 0; j < 8; j++)//考虑在第row行的各列放置皇后
	{
		m[row - 1][j] = 'Q';//在其中一列中放置皇后
		if (Check(row, j + 1) == true)//检查在该列放置皇后是否可行
		{
			if (row == 8) Output();//若该列可放置皇后,且该列为最后一列,则找到可行解,输出
			else  EightQueen(row + 1);//该列可放置皇后,则向下一行继续搜索,求解。
		}//取出该列的皇后,进行回溯,在其他列放置皇后
		m[row - 1][j] = '*';
	}
}
void main()
{
	EightQueen(1);//求解。
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值