软件工程部编程小结第一期
八皇后的问题,其实是一个回溯法的典型实例,下面就是它的一种实现,纯粹出自个人的想法,但是有点问题:网上说八皇后的解法有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年首先提出的。 要求在国际象棋的棋盘上放置八个皇后,使其不能相互攻击,即任意两个皇后不能处于 棋盘的同一行、同一列和同一条对角线...
八皇后问题是一个经典的计算机编程问题,它涉及到回溯算法、数据结构和图形用户界面的设计。在C++中,特别是结合MFC(Microsoft Foundation Classes)框架,可以创建具有用户友好界面的程序来解决此问题。 首先,...
### 八皇后问题详解 #### 一、八皇后问题背景 八皇后问题是一个经典的计算机科学问题,也是数学领域中一个有趣的挑战。这个问题来源于国际象棋的背景:如何在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何...
《八皇后问题与Java编程实现》 八皇后问题是一个经典的回溯算法问题,源自19世纪的数学家欧拉提出,旨在在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线上都不能有...
C语言实现八皇后问题 C语言实现八皇后问题是指使用C语言编写程序来解决八皇后问题,这是一个经典的算法问题。八皇后问题是指在8x8的棋盘上摆放8个皇后,使得每个皇后都不会受到其他皇后的攻击,即不能在同一行、同...
它们被应用于解决各种复杂问题,包括经典的八皇后问题。八皇后问题是一个著名的棋盘放置问题,要求在8×8的棋盘上摆放8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。下面将详细解释这些方法以及...
八皇后问题课程设计论文
八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++
解决八皇后问题的程序。 (2)程序设计说明 ① 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋上摆放8个皇后,使其不能相互共计,即任意...
linux c语言实现八皇后问题。希望对你的学习
作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面
《八皇后问题与C++实现解析》 八皇后问题是一个经典的计算机科学问题,源自国际象棋,由数学家马克斯·贝瑟尔在19世纪提出。问题的核心是:如何在一个8×8的棋盘上放置8个皇后,使得任何一个皇后都无法直接攻击到...
“八皇后”问题归朔法求解。八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...
八皇后动态图形的实现 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一...
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...
数据结构八皇后问题 eightqueens
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...
八皇后问题是一个经典的问题,在计算机科学和人工智能领域中具有重要的地位。它是由19世纪的数学家鲁道夫·路易斯·卡尔·莱昂哈德·欧拉提出,后来由卡尔·弗里德里希·高斯进一步研究。这个问题的基本设定是在一个...
《八皇后问题与Qt界面实现解析》 八皇后问题是一个经典的计算机编程问题,它源于19世纪由数学家鲁道夫·费迪南德·莱昂哈德·欧拉提出,旨在在8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都无法通过同一行...
数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...