【文件属性】:
文件名称:n后问题报告 算法与算法设计
文件大小:43KB
文件格式:DOC
更新时间:2011-11-20 07:03:06
n后问题报告 算法与算法设计
#include "stdafx.h"
#include
#define NUM 8 //定义数组大小
int main ()
{ int a[NUM+1 ]; //int number;
int i;
int k;
int flag;
int notfinish = 1;
int count = 0; i = 1; //正在处理的元素下标,表示前i-个元素已符合要求,正在处理第i个元素
a[1] = 1; //为数组的第一个元素赋初值
printf ("结果:\n");
while (notfinish) //处理尚未结束
{
while (notfinish && i <= NUM) //处理尚未结束且还没处理到第NUM个元素
{
for (flag = 1, k = 1; flag && k < i; k++) //判断是否有多个皇后在同一行
{
if (a[k] == a[i])
flag = 0;
}
for (k = 1; flag && k < i; k++) //判断是否有多个皇后在同一对角线
{
if ((a[i] == a[k] - (k - i)) || (a[i] == a[k] + (k - i)))
flag = 0;
}
if (!flag) //若存在矛盾不满足要求,需要重新设置第i个元素
{
if (a[i] == a[i - 1]) //若a[i]的值已经经过一圈追上a[i-]的值
{
i--; //退回一步,重新试探处理前的一个元素
if (i > 1 && a[i] == NUM)
{
a[i] = 1; //当a[i]的值为NUM时将a[i]的值置
}
else if (i == 1 && a[i] == NUM)
{
notfinish = 0; //当第一位的值达到NUM时结束
}
else
{
a[i]++; //将a[i]的值取下一个值
}
}
else if (a[i] == NUM)
{
a[i] = 1;
}
else
{
a[i]++; //将a[i]的值取下一个值
}
}
else if (++i <= NUM) //第i位已经满足要求则处理第i+位
{
if (a[i - 1] == NUM) //若前一个元素的值为NUM则a[i]=
{
a[i] = 1;
}
else
{
a[i] = a[i - 1] + 1; //否则元素的值为前一个元素的下一个值
}
}
}
if (notfinish)
{
++count;
printf ((count - 1) % 3 ? "[%2d]:" : "[%2d]:", count);
for (k = 1; k <=NUM; k++) //输出结果
{
printf (" %d", a[k]);
}
printf (" \n");
if (a[NUM - 1] < NUM) //修改倒数第二位的值
{
a[NUM - 1]++;
}
else
{
a[NUM - 1] = 1;
}
i = NUM - 1; //开始寻找下一个满足条件的解
}
}//while
return 0;
}