• N-皇后问题


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

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

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

    常量和变量说明

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

    count: 统计放置方案数

    N: 皇后数

    C++代码:

    #include "stdafx.h"

    #include <iostream>

     

    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(" ");

    }

    //考虑下一个皇后

    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;

    }

     

     

  • 相关阅读:
    (React 框架)React技术
    React 项目
    JS语法之--模块化
    JS 语法之-- 解构,Promise(异步)
    JS 语法之--对象类型(构造器,class,this),高阶对象(高阶类,Minix模式)
    javascript:console对象与控制台
    javascript:错误处理
    javascript:基本数据类型转换
    javascript:数据结构-数组
    javascript:数据结构-对象
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/8999929.html
Copyright © 2020-2023  润新知