【无标题】

            C# 回溯算法 回溯,就是搜索一个问题的一个解时,当没有可行解救回到根节点再进行遍历,直到所有解都遍历一遍。 1、基本思想: 在确定了解空间的组织结构后,回溯法从开始结点(根节点)出发,以深度优先的方式搜索整个解空间。这个开始节点就成为了一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为了一个新的活结点,并成为当前扩展结点。如果在当前扩展界定啊出不能再向纵深方向移动,则当前的扩展结点就成为死结点。换句话说这个结点不再是一个活结点。此时,应往回移动(回溯)至最近的有一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作凡是递归地解空间中搜索,直到找到所要求的解或解空间中已无活结点时为止。 2、N皇后问题: 这是来源于国际象棋的一个问题。N后问题要求在一个N x N格的棋盘上放置n个皇后,使得他们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子。因此,n后问题等价于要求在一个N x N格的棋盘上放置n个皇后,使得任何两个皇后不能被放在同一行或同一列或同一条斜线上。 

class Class1 { static void Main(string[] args) { int n = 8; Queue(n); Console.ReadLine(); } public static void Queue(int n) { int i; int index = 1; //第一个皇后 int[] CNum = new int[n + 1]; int ANum = 0; string sss = null;//定义一个空变量 for (i = 1; i <= n; i++) { CNum[i] = 0;//初始化从第0列开始 } while (index > 0) { CNum[index]++;//第index个皇后所在的列数 while (CNum[index] <= n && !Place(CNum, index)) //寻找皇后的位置 { CNum[index]++; } if (CNum[index] <= n) { if (index == n)//最后一个皇后放置成功 { ANum++;//第几种可行方案 sss = "\t " + “方法” + ANum + “:”; for (i = 1; i <= n; i++) { sss = sss + " " + CNum[i]; } Console.WriteLine(sss); //for (i = 1; i <= n; i++) // CNum[index]++; } else //继续寻找下一个皇后的位置 { index++; //皇后数+1 CNum[index] = 0; } } else { index–; //当前皇后无法放置,回溯至上一个皇后 } } } public static bool Place(int[] Column, int index) //Column–列 { int i; for (i = 1; i < index; i++)//如果index为3,那么就跟前两个皇后进行比较 { int Columndiffer = System.Math.Abs(Column[index] - Column[i]); int Rowdiffer = System.Math.Abs(index - i); if (Column[i] == Column[index] || Columndiffer == Rowdiffer)//是否有皇后与其在同列或同一斜线上 { return false; } } return true; //没有皇后与其同行,同列或同对角线 } }
上面说了那么多,其实如果要总结的话就一句话,用我自己的话来说就是(因为比较抽象,我就举个栗子),假如有一片网状的路,有的路可以通行,有的则是死胡同,一个人迷茫的寻觅着路的尽头,当他发现现在的路走不通了,遇到死胡同了,他就后退到交叉路口再选一条路走,如此反复,直到尽头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值