当前位置: 首页 > 编程笔记 >

C语言基于回溯算法解决八皇后问题的方法

邹缪文
2023-03-14
本文向大家介绍C语言基于回溯算法解决八皇后问题的方法,包括了C语言基于回溯算法解决八皇后问题的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C语言基于回溯算法解决八皇后问题的方法。分享给大家供大家参考,具体如下:

问题描述:

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例:在8X8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

问题求解:

采用回溯算法,即从第一行开始,依次探查可以放置皇后的位置,若找到,则放置皇后,开始探查下一行;若该行没有位置可以放置皇后,则回溯至上一行,清除该行放置皇后的信息,从该行原本放置皇后的下一个位置开始探查可以放置皇后的位置。求所有解时,每找到一组解,就清除这一组解最后一个皇后的位置信息,开始探查该行另外一个可以放置皇后的位置,依次回溯求解。

存储结构:

一维数组:col[8]:存放第i列有无皇后的标记信息
一维数组:left[15]:存放每一条左斜线上的有无皇后的标记信息
一维数组:right[15]:存放每一条右直线上有无皇后的标记信息
一维数组:Q[8]:存放第i行的皇后的列下标

代码实现:

#include<stdio.h>
#define N 8
int col[N] = { 0 };
int right[2 * N - 1] = { 0 };
int left[2 * N - 1] = { 0 };
int Q[N];
int cnt = 0;
void Print()
{
  int i;
  for (i = 0; i < N; i++)
  {
    for (int j = 0; j < N; j++)
    {
      if (Q[i] == j)
        printf("■");
      else
        printf("□");
    }
    printf("\n");
  }
  printf("==========================\n");
  cnt++;
}
void Queen(int i)
{
  int j;
  for (j = 0; j < N; j++)
  {
    if ((!col[j]) && (!left[i + j]) && (!right[7 + i - j]))
    {
      Q[i] = j;//放皇后
      col[j] = 1;
      left[i + j] = 1;
      right[N - 1 + i - j] = 1;//已有皇后的标记
      if (i < N - 1)
      {
        Queen(i + 1);
      }
      else
      {
        Print();
      }
      col[j] = 0;
      right[N - 1 + i - j] = 0;
      left[i + j] = 0;//清除标记,查找下一组解
    }
  }
}
int main(void)
{
  Queen(0);
  printf("%d", cnt);
  getchar();
  return 0;
}

运行结果:

一共92组解,前面结果略去。。

希望本文所述对大家C语言程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C语言八皇后问题解决方法示例【暴力法与回溯法】,包括了C语言八皇后问题解决方法示例【暴力法与回溯法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言八皇后问题解决方法。分享给大家供大家参考,具体如下: 1.概述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后

  • 本文向大家介绍C#用递归算法解决八皇后问题,包括了C#用递归算法解决八皇后问题的使用技巧和注意事项,需要的朋友参考一下 1.引子   中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过

  • 本文向大家介绍python八皇后问题的解决方法,包括了python八皇后问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了python八皇后问题的解决方法,供大家参考,具体内容如下 题目: 给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上、竖线上、斜线上。一般我们都讨论8皇后,但是只要N > 4,都会存在解的。 分析: 方法1:根据

  • 本文向大家介绍利用C语言解决八皇后问题以及解析,包括了利用C语言解决八皇后问题以及解析的使用技巧和注意事项,需要的朋友参考一下 前言 八皇后问题是一个古老而著名的问题。该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后之间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法? 回溯算法也叫试

  • 本文向大家介绍python 使用递归回溯完美解决八皇后的问题,包括了python 使用递归回溯完美解决八皇后的问题的使用技巧和注意事项,需要的朋友参考一下 八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求 任意两个棋子不能在

  • 本文向大家介绍Python解决八皇后问题示例,包括了Python解决八皇后问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python解决八皇后问题的方法。分享给大家供大家参考,具体如下: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。