N皇后

N皇后

Problem Description

八皇后问题是算法领域的经典问题,在国际象棋棋盘上总共是8*8的格子,在每一行中都要放置一个皇后,任意两个皇后之间不能相互攻击,皇后的攻击范围是直线和斜线,也就是任意两个皇后都不能处于同一个横行、纵行或斜线上。

现在我们将问题扩展为N皇后问题,也就是在N*N的棋盘上放置N个皇后,必须满足任意两个皇后不能相互攻击,写一个程序计算在给定N之后,有多少种不同的摆放方法(不考虑对称等问题)。

Input

给定一个正整数N表示皇后的个数。

Output

不同摆放方法的个数。

题解

#include<cstdio>
#include<cmath>
int N;
int count = 0;
int location[20];

int valid(int row, int col) {
  for (int i = 1;i <= row - 1;i++) {
    if (col == location[i] || abs(row - i) == abs(col - location[i])) {
    return 0;
    }
  }
  return 1;
}

void dfs(int row) {
  if (row == N + 1) {
    count++;
    return;
  }
  for (int i = 1;i <= N;i++) {
    if (valid(row, i)) {
      location[row] = i;
      dfs(row + 1);
    }
  }
}
int main() {
  scanf("%d", &N);
  dfs(1);
  printf("%d\n", count);
  return 0;
}

posted on 2020-07-13 19:53  Taurus20000519  阅读(110)  评论(0)    收藏  举报