zoukankan      html  css  js  c++  java
  • 回溯法解决N皇后问题 C语言

    问题描述:

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

    回溯法:

           回溯法又称试探法。回溯法的基本做法是深度优先搜索。即从一条路往前走,能进则进,不能进则退回来,换一条路再试。

    源代码:

    #include<stdio.h>
    #include<math.h>
    int x[9]={0};
    bool PLACE(int k)//检测第k个皇后能否放进棋盘
    {
        int i=1;
        while(i<k)
        {
            if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k))
                return false;
            i++;
        }
        return true;
    }
    void NQUEENS(int n)
    {
        int i,k=1; //k为当前行号
        x[1]=0;//x[k]为第k行皇后所放的列号
        while(k>0)
        {
            x[k]++;
            while(x[k]<=n&&!PLACE(k))//该行不符合,则放入下一行
              x[k]++;
            if(x[k]<=n)
            {
                if(k==n)//输出x[]
                {
                    for(i=1;i<=n;i++)
                        printf("x[%d]:%d  ",i,x[i]);
                    printf("
    ");
                }
    
                else//判断下一行
                {
                    k++; x[k]=0;
                }
            }
            else k--;//没找到,则回溯
        }
        return ;
    }
    int main()
    {
        NQUEENS(8);
        return 0;
    }
  • 相关阅读:
    MySQL主从复制搭建
    CSS基本样式简单介绍
    前端代码编码规范
    Markdown语法简单介绍
    Java API 操作Redis
    Java API 操作Zookeeper
    MySQL优化
    ES 可视化工具
    消息队列MQ
    Docker基础
  • 原文地址:https://www.cnblogs.com/yuyu-blog/p/9046670.html
Copyright © 2011-2022 走看看