回溯法求N皇后问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Tree-回溯法求N皇后问题
#include
#include
#define N 4 //N皇后
typedef int Chessboard[N + 1][N + 1]; //第0号位置不用
bool check(Chessboard cb, int i, int j) { //看棋盘cb是否满足合法布局
int h, k;
int m = i + j, n = i - j;
for(h=1; h
if(cb[h][j] == 1 && h != i) return false; //检查第j列
if(m-h<=N && cb[h][m-h] == 1 && h != i) return false; //检查斜的,m-h<=N是为了保证不越界
if(h-n<=N && cb[h][h-n] == 1 && h != i) return false; //检查斜的,h-n<=N是为了保证不越界
}
for(k=1; k return true; } void printfChessboard(Chessboard cb) {//打印棋盘 int i, j; for(i=1; i<=N; i++) { for(j=1; j<=N; j++) printf("%d ", cb[i][j]); printf("\n"); } printf("\n"); } /*进入本函数时,在n*n棋盘前n-1行已放置了互不攻击的i-1个棋子。现从第i行起继续为后续棋子选择合适位置。当i>n时,求得一个合法的布局,输入之。*/ void trial(int i, Chessboard &cb) { int j; if(i > N) printfChessboard(cb); else { for(j=1; j<=N; j++) { cb[i][j] = 1; if(check(cb, i, j)) trial(i + 1, cb); cb[i][j] = 0; } } } void main() { int i, j; Chessboard cb; for(i=1; i<=N; i++) for(j=1; j<=N; j++) cb[i][j] = 0; //必须初始化,它的默认值不是0 trial(1, cb); }