zoukankan      html  css  js  c++  java
  • 【八皇后问题】

    /*
    八皇后问题
    说明:
    西洋棋中的皇后可以直接前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,
    1970年与1971年,E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。
    
    解法:
    关于棋盘的问题,可以用递回求解,然而如何减少递回的次数?在八个皇后额问题中,不必要所有的个子都检查过,例如若某列
    检查过,该列的其他格子就不用再检查了,这个方法称为分支修剪。 
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 8
    
    int column[N+1];    // 同栏是否有皇后,1表示有 
    int rup[2*N+1];        // 右上至左下是否有皇后 
    int lup[2*N+1];        // 左上至右下是否有皇后 
    int queen[N+1] = {0};
    int num;            //解答编号 
    
    void backtrack(int);    //递回求解 
    
    int main(void)
    {
        int i;
        num = 0;
        
        for(i = 1; i <= N; i++)
        {
            column[i] = 1;
        }
        
        for(i = 1; i <= 2*N; i++)
        {
            rup[i] = lup[i] = 1;
        }
        
        backtrack(1);
        
        return 0;
    }
    
    void showAnswer()
    {
        int x, y;
        printf("
    解答 %d 
    ", ++num);
        
        for(y = 1; y <= N; y++)
        {
            for(x = 1; x <= N; x++)
            {
                if(queen[y] == x)
                {
                    printf("");
                }
                else
                {
                    printf(""); 
                } 
            }
            printf("
    ");
        }
    }
    
    void backtrack(int i)
    {
        int j; 
        
        if(i > N)
        {
            showAnswer();
        }
        else
        {
            for(j = 1; j <= N; j++)
            {
                if(column[j] == 1 && rup[i+j] == 1 && lup[i-j+N] == 1)
                {
                    queen[i] = j;
                    column[j] = rup[i+j] = lup[i-j+N] = 0;
                    backtrack(i+1);
                    column[j] = rup[i+j] = lup[i-j+N] = 1;
                }
            }
        }
    }

    运行结果:(因为运行的出的答案很长所以就指截取前面一部分和后面一部分了)

    =====================================

    转载本博请联系作者! 如有问题请在评论区评论或者发邮件:@libras

  • 相关阅读:
    C#调用默认浏览器打开网页的几种方法
    关于百度排名点击器作弊提升百度排名的说明
    网站被百度降权的各种原因大解析
    百度搜索引擎排名原理、因素
    【ASP.NET开发】获取客户端IP地址 via C#
    防抖和节流
    vuex
    watch 和 computed
    JavaScript捕获与冒泡与委托
    XSS攻击
  • 原文地址:https://www.cnblogs.com/libra-yong/p/6296295.html
Copyright © 2011-2022 走看看