美文网首页
回溯法 八皇后问题

回溯法 八皇后问题

作者: suntwo | 来源:发表于2019-05-22 16:11 被阅读0次

问题描述

要在8*8的国际象棋中放八个皇后,使任意两个皇后不能相互吃掉,在同一行,同一列,同一对角线会相互吃掉,求所有的可能。

回溯法思想

我们可以先在第一行找出相应的位置,然后再在下一行找符合条件的位置,当我们找到一种解决方法是便将结果输出,继续回溯寻找。

代码

#include<stdlib.h>
#include<stdio.h>
int a[100];
int output(int n)
{
    for(int i=1;i<=n;++i)
        printf("%d ",a[i]);
    printf("\n");
}
int huisu(int n)
{
    int k=1;
    a[1]=0;
    while(k>0)
    {
        a[k]+=1;
        while(k<=n && (check(k)==0))
            a[k]+=1;   //表示第k行向后移一个位置
        if(a[k]<=n)
        {
            if(k==n)  //表示遍历到最后一行
            {
                output(n);
            }
            else
            {
                k+=1;   //开始下一行
                a[k]=0;
            }
        }
        else
            k-=1;
    }
}

int check(int k)
{
    //检查是否冲突
    int i;
    for(i=1;i<k;++i)     //下标是从1开始的
    {
        if(abs(a[i]-a[k])==abs(i-k) || a[i]==a[k])
            return 0;
    }
    return 1;
}
int main()
{
    int n;
    printf("输入个数:\n");
    scanf("%d",&n);
    huisu(n);
}


代码分析

  • 主要是huisu()这个函数,我们介绍一下这个函数的作用。
 while(k<=n && (check(k)==0))
            a[k]+=1;   //表示第k行向后移一个位置

这个的作用是寻找第k行符合条件的位置,即不冲突,寻找位置的方法是将第k行的每个位置顺序和前k-1个位置进行检查看是否冲突,当都不冲突时便表示这个位置可以用,将这个位置保存到a[k]当中,当第k行没有满足条件的时最后a[k]=n+1,后面可以使用这个条件判断是否进行回溯,当a[k]=n+1便表示这一行已经没有可以使用的位置了,因此便会回溯到第k-1行。

  • 下面的代码。
if(a[k]<=n)
        {
            if(k==n)  //表示遍历到最后一行
            {
                output(n);
            }
            else
            {
                k+=1;   //开始下一行
                a[k]=0;
            }
        }
        else
            k-=1;
    }

首先判断a[k]是否小于等于n,如果大于n,表示这一行已经没有符合条件的了,便回溯。否则判断k是否为n,如果为n,表示已经全部挑选出位置了,便可以输出了,如果k<n,表示还没有将所有的皇后都安排到合适的位置,便将k=k
+1,开始查找下一行,下一行从头开始进行寻找。

相关文章

  • N皇后

    回溯法核心代码: n皇后问题回溯法

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

  • 回溯法 八皇后问题

    问题描述 要在8*8的国际象棋中放八个皇后,使任意两个皇后不能相互吃掉,在同一行,同一列,同一对角线会相互吃掉,求...

  • 八皇后问题c语言算法

    目录[TOC] 问题分析: 相信八皇后规则的问题,大家都很熟悉,接下来是如何分析回溯法的应用。回溯法与图里面的深度...

  • 51. N-Queens

    题目分析 N 皇后问题 + 回溯法 代码

  • 回溯法解八皇后问题

    问题介绍 摘自百度百科八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟...

  • 回溯法初探(一)

    回溯法是的应用范围很广,主要用于数据量不是很大的暴力求解问题,比如"图的m着色问题","八皇后问题"。 ...

  • 【洛谷 P1219】八皇后

    八皇后(题目链接) 思路 典型的深搜回溯问题 代码

  • 八皇后问题回溯法和迭代法

    数据结构系列文章: 常用的排序 二叉树的4种遍历 八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型...

  • 暴力穷举和回溯法(八皇后问题)

    以前每次遇到算法问题都是直接暴力求解,一直以为自己用的是暴力穷举法,现在学了回溯法,发现部分问题其实使用的是回溯法...

网友评论

      本文标题:回溯法 八皇后问题

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