返回信息流#include <stdio.h>
#include<math.h>
#define N 8 /* 定义棋盘大小 */
int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */
void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */
void chessboard(); /* 每找到一个解,打印当前棋盘状态 */
static int sum, /* 当前已找到解的个数 */
x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */
main()
{
backtrack(0);
return 0;
}
int place(int k)
{
int j = 0;
/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */
/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */
/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/
for (; j < k; j ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k]))
return 0;
return 1;
}
void backtrack(int t)
{
int i = 0;
/* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */
if (t == N)
chessboard();
else
for (; i <=N-1; i ++) {
x[t] = i;
if(place(t))
backtrack(t + 1);
}
}
void chessboard()
{
int i = 0,j = 0;
printf("第%d种解法:\n", ++ sum);
for (; i < N; i ++) {
for (; j < N; j ++){
if (j == x[i])
printf("1 ");
else printf("0 ");
}
printf("\n");
}
}
按照chessboard的输出语句 怎么会得到附件中的结果???
附件(152.1KB)
这是一条镜像帖。来源:北邮人论坛 / cpp / #33354同步于 2009/12/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于八皇后的问题
huangzz
2009/12/13镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
显示不出1到59是因为输出格式有问题,printf(“\n”)应在两次循环后面,另外chessboard里循环j要重新赋值为0.不知道printf("1 "); else printf("0 "); 是干啥,改了一下:
#include <stdio.h>
#include<math.h>
#define N 8 /* 定义棋盘大小 */
int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */
void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */
void chessboard(); /* 每找到一个解,打印当前棋盘状态 */
static int sum, /* 当前已找到解的个数 */
x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */
int main()
{
backtrack(0);
return 0;
}
int place(int k)
{
int j = 0;
/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */
/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */
/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/
for (; j < k; j ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k]))
return 0;
return 1;
}
void backtrack(int t)
{
int i = 0;
/* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */
if (t == N)
chessboard();
else
for (; i <=N-1; i ++) {
x[t] = i;
if(place(t))
backtrack(t + 1);
}
}
void chessboard()
{
int i = 0,j = 0;
printf("第%d种解法:\n", ++ sum);
for (; i < N; i ++) {
for (j=0; j < N; j ++)
{
if (j == x[i])
printf("%d ",j);
}
}
printf("\n");
}