`

八皇后

阅读更多
软件工程部编程小结第一期
八皇后的问题,其实是一个回溯法的典型实例,下面就是它的一种实现,纯粹出自个人的想法,但是有点问题:网上说八皇后的解法有92中,我的打印出来有88种,可能哪里错了,还望高手指正!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EmpCount 8

typedef struct
{
	int x,y;
}
DataType;

struct SeqStack
{
	int MAXNUM;
	int t;
	DataType *s;
};

typedef struct SeqStack *PSeqStack;

//创建一个空栈
PSeqStack createEmptyStack_seq(int m)
{
	PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
	if(pastack != NULL)
	{
		pastack->s = (DataType*)malloc(sizeof(DataType)*m);
		if(pastack->s)
		{
			pastack->MAXNUM = m;
			pastack->t = -1;
			return pastack;
		}
		else free(pastack);
	}
	printf("Out of space!!\n");
	return NULL;
}

//判断栈是否为空
int isEmptyStack_seq(PSeqStack pastack)
{
	return (pastack->t==-1);
}

//压栈操作
void push_seq(PSeqStack pastack,DataType x)
{
	if(pastack->t >= pastack->MAXNUM-1)
	{
		printf("Overflow!\n");
	}
	else
	{
		pastack->t = pastack->t+1;
		pastack->s[pastack->t] = x;
	}
}

//弹栈操作
void pop_seq(PSeqStack pastack)
{
	if(pastack->t == -1)
	{
		printf("Underflow!\n");
	}
	else
		pastack->t = pastack->t - 1;
}

//返回栈顶元素
DataType top_seq(PSeqStack pastack)
{
	if(pastack->t == -1)
	{
		printf("It is empty!\n");
	}
	else
		return pastack->s[pastack->t];
}

void print(int maze[][EmpCount])
{
	printf("\t\t-1\t");
	for(int m=0;m<EmpCount;m++)
	printf("%d ",m);
	printf("\n");
	//maze[5][5] =1;
	for(m=0;m<EmpCount;m++)
	{
		printf("\n\t\t%d\t",m);
		for(int n=0;n<EmpCount;n++)
			if(maze[m][n]==1)
				printf("▲");
			else
				if((m+n)%2==0)
					printf("□");//■");
				else
					printf("□");
	}
	printf("\n\t\t\t");	
}

bool checkEmp(PSeqStack pastack,int i,int j)
{
	if(isEmptyStack_seq(pastack))
		return false;
	if( i>=EmpCount || j>=EmpCount)
		return true;
	DataType element;
	for(int k=0;k!=pastack->t+1;k++)
	{
		element = pastack->s[k];
		if( (i==element.x) || (j==element.y) || (abs(j-element.y)==(i-element.x)) )
		{
			return true;
		}
	}
	return false;
}

void Empress(int maze[][EmpCount])
{
	int allCount = 0;
	int oneEmpress [EmpCount][2];
	int count = 0;
	int test;
	DataType element,element1;
	PSeqStack pastack = createEmptyStack_seq(EmpCount);
	for(int k=0;k!=EmpCount;k++)
	{
		oneEmpress[k][0]=0;
		oneEmpress[k][1]=0;
	}
	int i=0,j=0;
	int g,h;
	element.x = 0;
	element.y = 0;
	push_seq(pastack,element);
	while(!isEmptyStack_seq(pastack))
	{
		element = top_seq(pastack);
		pop_seq(pastack);
		i = element.x;
		j = element.y+1;
		while(i<EmpCount)
		{
			if(!checkEmp(pastack,i,j))
			{
				element.x = i;
				element.y = j;
				push_seq(pastack,element);
				i++;
				j=0;
			}
			else
			{
				if(j<EmpCount-1)
					j++;
				else
				{
					element = top_seq(pastack);
					pop_seq(pastack);
					i = element.x;
					j = element.y;
					if(j<EmpCount-1)
						j++;
					else
						break;
				}
			}
		}
		if(pastack->t==EmpCount-1)
		{
			printf("\n\r第%d个八皇后图\n",++allCount);
			for(int k=0;k<=pastack->t;k++)
			{
				printf("the node is:%d,%d\n",pastack->s[k].x,pastack->s[k].y);
				maze[pastack->s[k].x][pastack->s[k].y]=1;
			}
			print(maze);
			for(int i=0;i!=EmpCount;i++)
			{
				for(int j=0;j<EmpCount;j++)
					maze[i][j] = 0;
			}
			pastack->s[pastack->t].y = pastack->s[pastack->t].y+1;
		}
	}
}

void main()
{
	int maze[EmpCount][EmpCount];
	for(int i=0;i!=EmpCount;i++)
	{
		for(int j=0;j<EmpCount;j++)
			maze[i][j] = 0;
	}
	Empress(maze);
}
分享到:
评论

相关推荐

    八皇后游戏 八皇后游戏 八皇后游戏 八皇后游戏

    八皇后游戏的说明: 问题的提出:八皇后是个古老而有趣的游戏,是由高斯于1850年首先提出的。 要求在国际象棋的棋盘上放置八个皇后,使其不能相互攻击,即任意两个皇后不能处于 棋盘的同一行、同一列和同一条对角线...

    mfc实现八皇后问题

    八皇后问题是一个经典的计算机编程问题,它涉及到回溯算法、数据结构和图形用户界面的设计。在C++中,特别是结合MFC(Microsoft Foundation Classes)框架,可以创建具有用户友好界面的程序来解决此问题。 首先,...

    八皇后问题详细的解法-23页 PPT PDF版.pdf

    ### 八皇后问题详解 #### 一、八皇后问题背景 八皇后问题是一个经典的计算机科学问题,也是数学领域中一个有趣的挑战。这个问题来源于国际象棋的背景:如何在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何...

    八皇后 的三种解法 (java编写)

    《八皇后问题与Java编程实现》 八皇后问题是一个经典的回溯算法问题,源自19世纪的数学家欧拉提出,旨在在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线上都不能有...

    C语言实现八皇后问题

    C语言实现八皇后问题 C语言实现八皇后问题是指使用C语言编写程序来解决八皇后问题,这是一个经典的算法问题。八皇后问题是指在8x8的棋盘上摆放8个皇后,使得每个皇后都不会受到其他皇后的攻击,即不能在同一行、同...

    爬山法、模拟退火法、遗传算法实现八皇后问题

    它们被应用于解决各种复杂问题,包括经典的八皇后问题。八皇后问题是一个著名的棋盘放置问题,要求在8×8的棋盘上摆放8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。下面将详细解释这些方法以及...

    八皇后问题课程设计论文

    八皇后问题课程设计论文

    八皇后问题 c++ 八皇后问题 c++

    八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++

    利用c++解决八皇后问题

    解决八皇后问题的程序。 (2)程序设计说明 ① 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋上摆放8个皇后,使其不能相互共计,即任意...

    八皇后问题的c语言实现

    linux c语言实现八皇后问题。希望对你的学习

    汇编解决八皇后问题

    作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面

    皇后问题 八皇后 C++

    《八皇后问题与C++实现解析》 八皇后问题是一个经典的计算机科学问题,源自国际象棋,由数学家马克斯·贝瑟尔在19世纪提出。问题的核心是:如何在一个8×8的棋盘上放置8个皇后,使得任何一个皇后都无法直接攻击到...

    knight“八皇后”问题归朔法求解

    “八皇后”问题归朔法求解。八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...

    八皇后动态图形的实现

    八皇后动态图形的实现 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一...

    八皇后c语言实现。。。

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    数据结构_八皇后 非递归

    数据结构八皇后问题 eightqueens

    C++八皇后问题代码,递归实现

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    八皇后问题..zip

    八皇后问题是一个经典的问题,在计算机科学和人工智能领域中具有重要的地位。它是由19世纪的数学家鲁道夫·路易斯·卡尔·莱昂哈德·欧拉提出,后来由卡尔·弗里德里希·高斯进一步研究。这个问题的基本设定是在一个...

    八皇后,Qt界面,回溯算法+概率算法实现,带实验报告。.zip

    《八皇后问题与Qt界面实现解析》 八皇后问题是一个经典的计算机编程问题,它源于19世纪由数学家鲁道夫·费迪南德·莱昂哈德·欧拉提出,旨在在8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都无法通过同一行...

    数据结构八皇后问题实验报告

    数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...

Global site tag (gtag.js) - Google Analytics