N-皇后问题

作者: zhixin9001 | 来源:发表于2018-05-06 21:57 被阅读3次

国际象棋中皇后可攻击其所在行、列以及对角线上的棋子。N-皇后问题是要在N行N列的棋盘上放置N个皇后,使得皇后必吃之间不受攻击,即任意两个皇后不在同一行、同一列和系统的对角线。

为解决这个问题,考虑采用回溯法:第i个皇后放在第i行,然后从第一个皇后开始,对每个皇后,从其对应行(第i个皇后对应第i行)的第一列开始尝试放置,若可以放置,则确定该位置并考虑下一个皇后;若与之前的皇后冲突,则考虑下一列;若超出最后一列,则重新确定上一个皇后的位置。重复该过程,直到找到所有的放置方案。

下面是算法的C++代码实现。

常量和变量说明

pos: 一维数组,pos[i]表示第i个皇后放置在第i行的具体位置

count: 统计放置方案数

N: 皇后数

C++代码:

#include "stdafx.h"

#include

int isPlace(int pos[], int k);

int main() {

const int N = 4;

int i, j, count = 1;

int pos[N + 1];

//初始化位置

for (i = 1; i <= N; i++) {

pos[i] = 0;

}

j = 1;

while (j >= 1) {

pos[j] = pos[j] + 1;

//尝试摆放第i个皇后

while (pos[j] <= N && isPlace(pos, j) == 0) {

pos[j] = pos[j] + 1;

}

//得到一个摆放方案

if (pos[j] <= N && j == N) {

printf("方案%d:", count++);

for (i = 1; i <= N; i++) {

printf("%d-", pos[i]);

}

printf("\n");

}

//考虑下一个皇后

if (pos[j] <= N && j < N) {

j = j + 1;

}

else {//返回考虑上一个皇后

pos[j] = 0;

j = j - 1;

}

}

system("pause");

return 1;

}

int isPlace(int pos[], int k) {

for (int i = 1; i < k; i++) {

if (pos[i] == pos[k] || fabs(i - k) == fabs(pos[i] - pos[k])) {

return 0;

}

}

return 1;

}

相关文章

  • 【算法】用回溯法(backtracking algorithm)

    什么是N-皇后问题? 说到这个N-皇后问题,就不得不先提一下这个历史上著名的8皇后问题啦。 八皇后问题,是一个古老...

  • N皇后问题(附带JavaScript源代码)

    什么是N-皇后问题? 说到这个N-皇后问题,就不得不先提一下这个历史上著名的8皇后问题啦。 八皇后问题,是一个古老...

  • N-皇后问题

    国际象棋中皇后可攻击其所在行、列以及对角线上的棋子。N-皇后问题是要在N行N列的棋盘上放置N个皇后,使得皇后必吃之...

  • N-皇后问题

    问题描述:有N个皇后,需要放在N*N的棋盘上,同一行、同一列、同一对角线不能同时出现两个及以上的皇后,一共有多少种...

  • 后海老师的朗读练习

    ian-uan对比(一) 烟yān-渊yuān 钱qián-权quán 尖jiān-娟juān 欠qiàn-劝qu...

  • 无穷级数

    数项级数判敛问题 重点记住:数项级数Un收敛可以推导出Un在n->∞时=0Un在n->∞时=0不可以推导出Un收敛...

  • 2019波谱解析复习纲要

    熟悉以前名词含义 吸收光谱 电子跃迁 σ-σ*跃迁 π-π*跃迁 n-π*跃迁 n-σ*跃迁 增色效应 减色...

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 皇后问题

    经常做算法赛题的朋友们都知道,八皇后问题是一道经典的搜索回溯题。简单来说,皇后问题就是在一个国际象棋棋盘上摆放若干...

  • 回溯之N皇后

    N皇后问题:在 n x n 的棋盘上放置 N 个皇后,使其不能相互攻击。 1. 问题分析 皇后相互攻击是指:在皇后...

网友评论

    本文标题:N-皇后问题

    本文链接:https://www.haomeiwen.com/subject/fcrprftx.html