八皇后的两种思路

题目描述:n皇后是指在一个n行n列的棋盘上,将n个皇后摆放在不同的位置,不能出现在同一行,同一列,同一斜线,问有多少种解法。

思路一:

建立一个二维数组,初始化都为0,(皇后的位置置1)从第一行开始放皇后,列有八种情况,从第一种情况开始,如果这个位置的上面的列,左上正对角线,以及右上正对角线没有皇后,则是安全的,这个位置可以放置皇后,继续递归下一行,否则继续探索这一行的其他列,如果这一行的所有列都不能放下皇后,则向上返回一层(从上一行的其他满足情况的列又开始向下探索)。 当有一种解法时打印棋盘,开始向上回溯探索当前列到n-1列是否有满足情况的,如果有则继续向下递归没有则向上一行回溯 直到回溯到第0行的第n-1列然后向下递归,没有向上的回溯时才完毕

思路二:

n个皇后分别在不同行的不同列,可以先将1–n进行排列组合,每个数的每个位置代表对应行的列,将所有的排列组合去除掉在同一斜线上的情况,剩下的就是n皇后的题解

代码1:

#include
#include 
#include 
using namespace std;
int _count=1;
int judge_safe(int check[8][8],int row,int m,int n)
{
    //判断当前位置的的前面数组里有没有和当前位置在同一条直线上
    //分成四部分,左上角,左下角,右上角和右下角

    //列
    for(int i=0;i=0&&j>=0;i--,j--)
    {
        if(check[i][j]==1)
            return 1;
    }
    //右上角
    for(int i=m-1,j=n+1;i>=0&&j

八皇后的两种思路_第1张图片
代码2:

#include
#include 
#include 
using namespace std;
int count=1;
void _swap(int a,int b,int *arr)
{
    int temp=arr[a];
    arr[a]=arr[b];
    arr[b]=temp;
}
 void is_ok(int check[9],int N)
  {
      //如果在同一条斜线上则返回0,从一个数开始判断它后面的元素是否和他在一条线上
      // 如果 j-i=abs(check[i]-check[j]);则在同一条线上
      for(int i=1;i<=N-1;i++)
      {
          for(int j=i+1;j<=N;j++)
          {
              if(j-i==abs(check[i]-check[j]))
            //  if(j-i==check[i]-check[j]||j-i==check[j]-check[i])
               return ;
          }
      }
     cout<<"---第--"<

八皇后的两种思路_第2张图片

你可能感兴趣的:(算法)