C语言八皇后问题解决方法示例【暴力法与回溯法】

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

1.概述:

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

2.暴力法求解:

#include<cstdio>
#include<cmath>
const int maxn=11;
int count=0;
//P为当前排列,hashTable记录整数x是否已经在P中
int n,P[maxn] ,hashTable[maxn] = {false};
//当前处理排列的第index号位
void generateP(int index)
{
  if(index==n+1)//递归边界,已经处理完排列的1~n位
  {
  bool flag=true;//flag为true表示当前排列为一个合法方案
  for(int i=1;i<=n;i++)
  {
    for(int j=i+1;j<=n;j++)
    {
      if(abs(i-j)==abs(P[i]-P[j]))//如果在对角线上
      {
        flag=false;//不合法
      }
    }
   }
   if(flag)  count++;//若当前方案合法,count+1
   return ;
 }
 for(int x=1 ; x<=n ; x++)//枚举1~n,试图将x填入P[index]
 {
  if(hashTable[x]==false)//如果x不在P[0]~P[index-1]中
  {
    P[index]=x; //令P的第index位为x,即把x加入当前排列
    hashTable[x]=true;//记x已在P中
    generateP(index+1);//处理排列的第index+1号位
    hashTable[x]=false;//已处理完P[index]为x的子问题,还原状态
}
}
}
int main()
{
  n=8;
  generateP(1);
  printf("%d\n",count);
  return 0;
}

3.回溯法求解;

#include<cstdio>
#include<cmath>
const int maxn=11;
int count=0;
//P为当前排列,hashTable记录整数x是否已经在P中
int n,P[maxn] ,hashTable[maxn] = {false};
//当前处理排列的第index号位
void generateP(int index)
{
  if(index==n+1)
  {
    count++;
    return ;
  }
  for(int x=1;x<=n;x++)//第x行
  {
    if(hashTable[x]==false)//第x行还没有皇后
    {
      bool flag=true;//flag表示当前皇后不会和之前的皇后冲突
      for(int pre=1;pre<index;pre++)//遍历之前的皇后
      {//第index行的皇后的行号为x,第pre列皇后的行号为P[pre]
        if(abs(index-pre)==abs(x-P[pre]))
        {
          flag=false;//与之前的皇后在一条对角线,冲突
          break;
         }
       }
       if(flag)//如果可以把皇后放在第x行
       {
        P[index]=x;//令第index列皇后的行数为x
         hashTable[x]=true;//第x行已经被占用
         generateP(index+1);//递归处理第index+1行皇后
         hashTable[x]=false;//递归完毕,还原第x行为为占用状态
       }
     }
   }
}
int main()
{
  n=8;
  generateP(1);
  printf("%d\n",count);
  return 0;
}

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

(0)

相关推荐

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

    本文实例讲述了C语言基于回溯算法解决八皇后问题的方法.分享给大家供大家参考,具体如下: 问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例:在8X8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 问题求解: 采用回溯算法,即从第一行开始,依次探查可以放置皇后的位置,若找到,则放置皇后,开始探查下一行:若该行没有位置可以放置皇后,则回溯至上一行,清除该行放置皇后的信息,从该行原本放置皇后的下一个位置开始探查可

  • 利用C语言解决八皇后问题以及解析

    前言 八皇后问题是一个古老而著名的问题.该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格:要求皇后之间不会出现相互"攻击"的现象,即不能有两个皇后处在同一行.同一列或同一对角线上.问共有多少种不同的方法? 回溯算法也叫试探法,它是一种搜索问题的解的方法.冋溯算法的基本思想是在一个包含所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意结点时,总是先判断该结点是否肯定不包含问题的解.如果肯定不包含,

  • C语言八皇后问题解决方法示例【暴力法与回溯法】

    本文实例讲述了C语言八皇后问题解决方法.分享给大家供大家参考,具体如下: 1.概述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 2.暴力法求解: #include<cstdio> #include<cmath> const int maxn=11; int count=0; //P为当前排列,hashTable记录整数x是否已经在

  • VSCode各语言运行环境配置方法示例详解

    系统环境变量的配置 如:将F:\mingw64\bin添加到系统环境变量Path中 VSCode软件语言json配置C语言 创建个.vscode文件夹,文件夹内创建以下两个文件 launch.json 文件配置 { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg&

  • Java基于循环递归回溯实现八皇后问题算法示例

    本文实例讲述了Java基于循环递归回溯实现八皇后问题.分享给大家供大家参考,具体如下: 运行效果图如下: 棋盘接口 /** * 棋盘接口 * @author Administrator * */ public interface Piece { abstract boolean isRow(int line); abstract boolean isCol(int line,int col); } 棋盘类: /** * 棋盘 * @author Administrator * */ public

  • Python走楼梯问题解决方法示例

    本文实例讲述了Python走楼梯问题解决方法.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 ''' 下楼问题.从楼上走到楼下共有h个台阶,每一步有两种走法: 走1个台阶,走2个台阶,问有多少可走的方案.用递归思想和迭代思想编程 ''' ''' 分析:问题可以从最后一次是走1步还是两步,反向考虑 ''' def take_stairs_recursive(n): if n == 1: return 1 elif n == 2: return 2

  • C语言金币阵列问题解决方法

    本文实例详细讲述了C语言实现金币阵列问题的解决方法,分享给大家供大家参考.具体方法如下: 问题描述: 有m*n(1 ≤ m, n ≤ 100)个金币在桌面上排成一个 m 行 n 列的阵列.每一枚金币或正面朝上或背面朝上.用数字表示金币状态,0表示金币正面朝上,1 表示背面朝上. 金币阵列游戏的规则是: 1. 每次可将任一行金币翻过来放在原来的位置上: 2. 每次可任选 2 列,交换这 2 列金币的位置. 本题要求对于给定的金币阵列初始状态和目标状态,编程计算按金币游戏规则,将金币阵列从初始状态变

  • Laravel项目中timeAgo字段语言转换的改善方法示例

    前言 在我们过去的Laravel项目中,经常需要用到time_ago这样的字段,并将其转换为我们熟悉的本地语言,可以实现的方式有很多,比如编写一个time_ago的辅助函数将其转换成本地,或采用carbon的diffForHumans函数然后替换成本地语言来实现. 过去我们编写过的代码像这样: 这样 但是我们需要将其替换成中文.繁体中文.日本或是韩文时,我们就需要编写多个类似的方法如: time_ago_CN //简体中文 time_ago_HK //繁体中文 time_ago_JP //日文

  • jsp传值中文乱码问题解决方法示例介绍

    在jsp中,我们经常从数据库读取数据返回客户端,但我们常常在制作时出现乱码现象,所以我们可以用<%request.setCharacterEncoding("UTF-8");%>这个方法来保证中文的正确输出,下面举个例子吧, 我们要接住表单的值或者把数据库数据打印出来的之前,先把<%request.setCharacterEncoding("UTF-8");%>放在他们的前面,然后,表单的提交方式必须是post,即method="p

  • 如何基于java语言实现八皇后问题

    这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 代码如下 package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 pu

  • Python解决八皇后问题示例

    本文实例讲述了Python解决八皇后问题的方法.分享给大家供大家参考,具体如下: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2.而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解. 这是一个典型的回溯算法,我们可以将问题进行分解: 首先,我们要想到某种方

随机推荐