Try Again

八皇后问题

题目描述

八皇后问题
是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出的,在8*8格的国际象棋上摆放八个皇后;使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上;
问有多少种摆法, 输出所有可能的解?

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=8;
int matrix[N][N]={0};
bool coutt(int matrix[N][N])
{
  static int count = 1;
  cout<<"Case "<<count++<<":"<<endl;
  for(int i=0;i<N;i++)
  {
    for(int j=0;j<N;j++)
    {
      if(matrix[i][j]==1)
      {
          cout<<"Q";
      }
      else cout<<"*";
    }
    cout<<endl;
  }
  cout<<endl;
  getchar();
}
bool Safety(int matrix[N][N], int row, int col)
{
    for (int i = 0; i < row ; i++)
    {
         for (int j = 0; j < N; j++)
                   if(matrix[i][j]==1&&(j==col||abs(row-i)==abs(col-j)))
                return false;
    }
    return true;
}
void BackTrack(const int i) {
    if (i >=N)
        coutt(matrix);
    else
        for (int j = 0; j < N; ++j) {
            matrix[i][j] = 1;
            if(Safety(matrix,i,j))
                         BackTrack(i + 1);
            matrix[i][j] = 0;
        }
}
int main()
{
  BackTrack(0);
  return 0;
}

 

 

posted @ 2017-03-18 16:04  十年换你一句好久不见  阅读(158)  评论(0)    收藏  举报