C语言实现关于八皇后的问题!急.....

设计程序完成如下要求:在8×8的国际象棋棋盘上,放置8个皇后,使得这8个棋子不能互相被对方吃掉。要求:(1)依次输出各种成功的放置方法。(2)最好能画出棋盘的图形形式,并... 设计程序完成如下要求:在8×8的国际象棋棋盘上,放置8个皇后,使得这8个棋子不能互相被对方吃掉。要求:(1)依次输出各种成功的放置方法。(2)最好能画出棋盘的图形形式,并在其上动态地标注行走的过程。(3)程序能方便地移植到其他规格的棋盘上。从第一行起逐行放置皇后,每放置一个皇后均需要对第1,2,…,8列进行试探,并尽可能取小的列数。若当前试探的列位置是安全的,则将该行的列位置保存在栈中,然后继续在下一行寻找安全位置,若当前试探的列位置不安全,则用下一列试探;当8列位置试探完毕都未找到安全位置时,就退栈回溯到上一行,修改栈顶保存的皇后位置,然后继续试探。要求能在VC6.0正确运行!把有关注释写清楚!写出其源代码!!!!谢谢.....
能不能说说你们的算法的思想?怎么想的!!我不是太明白!!谢谢。。。。
展开
 我来答
niyongyixi
2009-05-17 · TA获得超过130个赞
知道答主
回答量:74
采纳率:0%
帮助的人:31.6万
展开全部
【【一共有92个解 通过测试的了 如果你要写好的C程序 告诉我你的邮箱 我给你发过去 你直接用就是了】】
#include "stdio.h"
#include "stdlib.h"
#define QUEEN 8
int count = 0; //用于计算解集数量

/*
a[i] = j
表示在棋盘上第i行第j列放有一个棋子
*/

/* 输出N皇后问题的解
输入:
a[]
保存棋子信息的数组.

length
数组的长度 八皇后即为8
*/

void output (int a[],int length){
int i ,j;
count ++;
printf("The %d of the solution is :\n",count);
for(i =0;i<length;i++){
for(j= 0;j<length;j++)
printf("%d",a[i]==j?1:0);
printf("\n");
}
}

void check(int a[],int length,int off){
int i = 0;
int value;

/*如果off和长度相等,说明棋子已经放好了,输出*/

if(off == length){
output(a,length);
return;
}

/* 从0 到length-1表示依次在棋盘的第off行,第value列上放置棋子*/

for(value = 0;value<length;value++){

/*校验*/
for(i = 0;i<off;i++)
if(value - a[i] == 0 //value-a[i]=0表示同一列上有两个棋子
||value - a[i]== off - i //value-a[i]= off -i表明同一左斜线上有两个棋子
||value - a[i]== i-off) //value-a[i]= i - off表明同一右斜线上有两个棋子
break;
if(i == off){ //校验完毕
a[off] = value; //将棋子放入
check(a,length,off+1); //继续放下一列
}
}
}
int main(){
int a[QUEEN] ;
check(a,QUEEN,0);
system("pause");
return 0;
}
poplarbbb
2009-05-16 · TA获得超过130个赞
知道答主
回答量:144
采纳率:100%
帮助的人:86.9万
展开全部
就是这样
#include "stdio.h"
#include "stdlib.h"
#define QUEEN 8
int count = 0; //用于计算解集数量

/*
a[i] = j
表示在棋盘上第i行第j列放有一个棋子
*/

/* 输出N皇后问题的解
输入:
a[]
保存棋子信息的数组.

length
数组的长度 八皇后即为8
*/

void output (int a[],int length){
int i ,j;
count ++;
printf("The %d of the solution is :\n",count);
for(i =0;i<length;i++){
for(j= 0;j<length;j++)
printf("%d",a[i]==j?1:0);
printf("\n");
}
}

void check(int a[],int length,int off){
int i = 0;
int value;

/*如果off和长度相等,说明棋子已经放好了,输出*/

if(off == length){
output(a,length);
return;
}

/* 从0 到length-1表示依次在棋盘的第off行,第value列上放置棋子*/

for(value = 0;value<length;value++){

/*校验*/
for(i = 0;i<off;i++)
if(value - a[i] == 0 //value-a[i]=0表示同一列上有两个棋子
||value - a[i]== off - i //value-a[i]= off -i表明同一左斜线上有两个棋子
||value - a[i]== i-off) //value-a[i]= i - off表明同一右斜线上有两个棋子
break;
if(i == off){ //校验完毕
a[off] = value; //将棋子放入
check(a,length,off+1); //继续放下一列
}
}
}
int main(){
int a[QUEEN] ;
check(a,QUEEN,0);
system("pause");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式