回溯法求N皇后问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); }

相关文档
最新文档