求C++的8-皇后问题的回溯程序

来源:百度知道 编辑:UC知道 时间:2024/06/18 07:11:57

// 8皇后.cpp : Defines the entry point for the console application.
//
//问题描述:在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;
//要求皇后间不会出现相互攻击的现象,即不能有两个皇后处在同一行、同一列或同一对角线上
//问共有多少种不同的摆放方法?

// 本解法采用回溯递归法,容易理解,
// 首先在棋盘上摆第一个皇后,然后摆第二个,每摆一个皇后则判断位置是否合法。
// 如果合法,则摆下一个皇后,如果不合法则在本行下一个位置尝试,所有位置尝试失败
// 则拿掉这个皇后,重新摆放上一个皇后的位置.
// 也就是说如果第n个皇后摆放失败 一直向上回溯 重新摆放第n-1皇后位置.
// 全局变量chess_board[]代表棋盘,每一行放一个皇后.
// 显然chess_board[4]==5 则说明第4个皇后放在第4行第5个位置
// 同理chess_board[1]==3 则说明第1个皇后放在第1行第3个位置
// 全局变量counter做计数器
// AtLight 2007-09-29

#include <iostream>
#define MAX 8
int chess_board[MAX+1];
int counter;
bool trial(int n)
{
//本函数用于判定棋盘第N行的皇后位置是否合法
//并打印出合法的方案
//为容易理解,本函数没有优化

int left_diagonal = chess_board[n] - 1;
int right_diagonal= chess_board[n] + 1;
for(int prior=n-1;prior>=1;prior--)
{
if(chess_boar