加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

经典算法10:回溯法求解八皇后

发布时间:2020-12-16 07:47:59 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace eightQueen { //八皇后问题:在8*8格

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    View Code   
      
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace eightQueen  
    {  
        //八皇后问题:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,  
        //即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                DateTime time1 = DateTime.Now;  
                QueenArithmetic(8);              //皇后个数可选  
                DateTime time2 = DateTime.Now;  
                TimeSpan span = time2 - time1;  
                Console.WriteLine("n执行时间:"+span);  
                Console.ReadKey();  
            }  
      
            //定义解决皇后问题方法,使用回溯法,根据皇后数量获取结果  
            static void QueenArithmetic(int queenNum)  
            {  
                int[] Queen = new int[queenNum];    //保存每次成功的结果,索引代表所在列,值代表皇后在该列的位置  
                int row = 0;    //当前所在的行      
                int column = 0;     //当前所在列  
                Queen[0]=-1;  
                int count = 0;     //用来记录当前是第几种摆法  
      
                while (true)  
                {  
                    for (row = Queen[column]+1; row < queenNum; row++)    //遍历本次回溯  该列中未被访问到的行  
                    {  
                        if (!IsConflict(Queen,column,row))        //如果不冲突  
                        {  
                            break;  
                        }   
                    }  
                    if (row >= queenNum)   //没有找到合适的位置  
                    {  
                        if (column == 0)   //如果当前已经回溯到了第一列  
                        {  
                            break;          //退出while循环,整个过程结束  
                        }  
                        else  
                        {  
                            Queen[column] = -1;      //否则回溯到上一列  
                            column--;  
                        }  
                    }  
                    else            //找到了合适的位置  
                    {  
                        Queen[column] = row;  
                        column++;               //为下一列找合适位置  
                        if (column < queenNum)//如果当前不是最后一列  
                        {  
                            Queen[column] = -1;  
                        }  
                        else     //说明本次查找完毕,开始打印输出  
                        {  
                            PrintQueen(Queen,queenNum,++count);//打印输出当前结果  
                            column--;               //回溯到上一列继续查找  
                        }  
                    }  
                }  
            }  
      
            //根据获得的皇后数组,判断当前位置(row,column)是否与前面冲突  
            static bool IsConflict(int[] queen,int column,int row)  
            {  
                for (int exsitColumn = 0; exsitColumn < column; exsitColumn++)  //遍历当前列之前的所有列中找到的皇后位置,检测是否与当前位置冲突  
                {  
                    int exsitRow = queen[exsitColumn];  
                    int span = column - exsitColumn;  
                    if ((row == exsitRow) || (row == exsitRow + span) || (row == exsitRow - span))  //如果在同一行或者同一条斜线上  
                    {  
                        return true;                                                            //即冲突  
                    }  
                }  
                return false;  
            }  
      
            //打印输出结果  
            static void PrintQueen(int[] queen,int queenNum,int count)  
            {  
                Console.WriteLine("n第{0}种摆法:",++count);  
                for (int c = 0; c < queenNum; c++)  
                {  
                    for (int r = 0; r < queenNum; r++)  
                    {  
                        if (r == queen[c])  
                        {  
                            Console.Write("Q");  
                        }  
                        else  
                        {  
                            Console.Write("*");  
                        }  
                    }  
                    Console.Write("n");  
                }  
            }  
        }  
    }  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读