八皇后问题 回溯法

来源:互联网 发布:中国软件市场分析 编辑:程序博客网 时间:2024/05/10 00:52
#include <iostream>using namespace std;#define MAX_LENGTH 50int is_conflict(int *a, int n){int flag= 0;int i;for(i= 0; i< n; i++)                      {   if(a[i]== a[n]|| a[i]- a[n]== i- n|| a[i]- a[n]== n- i){flag= 1;break;}}return flag;}void print_board(int *a, int n){int i,j;for(i= 0; i< n; i++){for(j= 0; j< a[i]; j++){cout<<" ";}cout<< "q";for(j= a[i]+1; j< n; j++ ){cout<< " ";}cout<< "/n";}cout<< "--------/n";}void init_board(int *a, int n){int i;for(i= 0; i< n; i++)a[i]= 0;}int queen(int n){int count= 0;int a[MAX_LENGTH];init_board(a, n);int i= 0;while(1){if(a[i]< n)   // 如果没有超过棋盘范围,需要检查第n行与前n-1行是否冲突{if(is_conflict(a, i))     //如果有冲突,尝试下一个位置{a[i]++ ; continue;}    if(i>= n-1)               // 如果是最后一行,也即找到一个解,首先输出它{count++;print_board(a, n);    a[n-1]++;continue;             //然后尝试当前的皇后的下一个位置,看有没有解}i++;  //如果没有冲突,进入下一行continue;}else                          //超过棋盘的范围,改行的皇后复位{a[i]= 0;i--;if(i< 0){return count;}a[i]++;continue;}}}int main(void){int n= 8;int count= queen(n);cout<< count<< " solutions in "<< n<< "queens problem "<< endl;return 0;}

原创粉丝点击