C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后。
八皇后问题的介绍在此。以下是用递归思想实现八皇后-N皇后。
代码如下:
using System;using System.Collections.Generic; namespace QueensSolution
{
class Program
{
static int count = ;
static void Main(string[] args)
{
int n = Int32.Parse(Console.ReadLine());
List<int> queen = new List<int>(n);
for (int i = ; i <= n; i++)
{
queen.Add();
}
PutQueen(n, queen, );
Console.WriteLine(count);
Console.ReadKey();
} private static void PutQueen(int n, List<int> queen, int row)
{
for (queen[row] = ; queen[row] <= n; queen[row]++)
{
if (CheckQueens(queen, row))
{
row++;
if (row < n)
{
PutQueen(n, queen, row);
}
else
{
count++;
for (int i = ; i < n; i++)
{
Console.Write(queen[i].ToString() + " ");
}
Console.WriteLine();
}
row--;
}
}
} private static bool CheckQueens(List<int> queen, int row)
{
for (int i = ; i < row; i++)
{
if (Math.Abs(queen[i] - queen[row]) == Math.Abs(i - row) || queen[i] == queen[row])
{
return false;
}
}
return true;
}
}
}
解释:
1.要想解出在n*n的棋盘上到底有多少种放置皇后的方法,主要用到两个方法,放皇后的PutQueen方法,检查皇后的CheckQueens方法。
2.在Main函数里对动态数组进行初始化,这个动态数组用来记录N皇后中每一行所放置的皇后的位置(1就代表放置在该行第一列,n就代表放置在该行的第n列)。
3.row代表的是八皇后棋盘的每一行。
4.在Main函数中对动态数组进行了一下初始化,这一步是必须的,否则运行结果报错。
5.变量count(解的个数)声明在Main函数外,是静态的。
6.PutQueen方法采用递归思想——放皇后(该行中每一列都要放置),检查放皇后的位置是否合理,如果合理则到下一行,判断下一行是否存在,如果存在——放皇后(该行中每一列都要放置),检查放皇后的位置是否合理,如果合理则……直到不存在下一行为止每一行都已经放置好了皇后,这时我们将解的个数记录一下(count++),然后打印该种解法。
7.在递归结束后,一定要记得返回到上一行(row--),这样才能让“for (queen[row] = 1; queen[row] <= n; queen[row]++)”生效,实现每一行中的每一列都放置过皇后。一定要注意row--的位置要放在整个if-else语句块的后面!因为整个if-else语句块形成了对递归过程中状态的判断,有两种状态,第一种状态是皇后当前在第2到n-1行,这时候如果想返回上一行,“row--”的位置其实可以写在if语句块中"PutQueen(n, queen, row);"这一句的后面;第二种状态是皇后当前在最后一行(也就是第n行),这时候如果想返回上一行,“row--”的位置其实可以写在else语句块中。因此,我们才将“row--”的位置移到了整个if-else语句块的后面。
C#中八皇后问题的递归解法——N皇后的更多相关文章
- N皇后问题(递归)
//八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...
- 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...
- [LeetCode系列]N皇后问题递归解法 -- 位操作方式
N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. ...
- [LeetCode系列]爬梯问题的递归解法转换为迭代解法
有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第 ...
- 递归实现N皇后问题
其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写. 其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N ...
- [Python3 练习] 006 汉诺塔2 非递归解法
题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...
- 递归与N皇后问题
递归的基本概念 一个函数调用其自身,就是递归 递归的作用 1) 替代多重循环 2) 解决本来就是用递归形式定义的问题 3) 将问题分解为规模更小的子问题进行求解 一行只能有一个皇后,这个根据游戏规则中 ...
- 用递归求n皇后问题
此问题是指在n*n的国际象棋棋盘上 ,放置n个皇后,使得这n个皇后均不在,同一行,同一列,同一对角线上,求出合法的方案的数目. 本题可以简单转化为就是求n的全排列中的数放在棋盘上使得这几组数,符合均不 ...
- 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3
按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...
随机推荐
- poj 1731 Orders
http://poj.org/problem?id=1731 Orders Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9 ...
- Java基础(53):内部类(转)
java中的内部类总结 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行 ...
- 手把手教你用动软.NET代码生成器实例教程
动软实战攻略 手把手教你用动软 文档编号:20110421 版权所有 © 2004-2011 动软 在线帮助:http://help.maticsoft.com 目录 一. 产品介绍 ...
- paper 40 :鲁棒性robust
最近只想安心.安静的科研,不想被任何人打扰,继续做自己,不忘初心,方得始终! 首先了解下鲁棒性这个词的定义.鲁棒性是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性.根据对性能的不同定义 ...
- jvm笔记
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数, ...
- JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总
一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出. 1,JSTL标签总结: a).JSTL标签有什么用? JSTL是由JCP(Java Commu ...
- Jqueryの锋利的jquery练习
$(function(){ $("div.SubCategoryBox li:gt(7):not(:last)").hide(); $("div.SubCategoryB ...
- [tp3.2.1]大D构建模型
使用大(写字母)D方法: 如果,在默认到Home模块下面找不到UserModel模块,那么就会到Common模块下去找. 而如果此时在Common模块下还是找不到UserModel,那就会调用Mode ...
- Jar mismatch! Fix your dependencies
在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这是因为两个项目的 ...
- android 百度地图定位开发1
首先注册成为百度开发者 然后进入百度开发者中心 点击LBS 跳到下一个页面 点击Android 开发 里面的基础地图 进入 点击获取密钥 进入 点击创建应用 进入 应用名称自己填 应用类 ...