内容:
八皇后问题是个古老而著名的问题,时回溯算法的典型例题。要在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);//求解。
}