BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #33354同步于 2009/12/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于八皇后的问题

huangzz
2009/12/13镜像同步1 回复
#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)
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
zsy08211517机器人#1 · 2009/12/14
显示不出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"); }