题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯觉得有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法能够解决此问题。
请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。
解题思路:我们採用回溯的思想来解这道题,開始我们从第一行第一列開始放第一个皇后,然后依次在第二行可放皇后的位置放置皇后,直到最后到达列的最大值时还没有将皇后放完,通过又一次回溯到第二列依次进行反复的操作,否则得到对应的皇后排放方法。
以下的代码能够实现n皇后问题的求解。
源码
package review; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class queens { public static int num = 0; // 累计方案总数
public static int queensnumber; // 皇后个数,同一时候也是棋盘行列总数
public static int[] cols; // 定义cols数组,表示n列棋子摆放情况 public static void main(String args[]) {
System.out.println("请输入要展示 的皇后数量");
BufferedReader strin = new BufferedReader(new InputStreamReader(
System.in));
try {
queensnumber = Integer.parseInt(strin.readLine());
if (queensnumber <= 0) {
System.out.println("输入不对");
} else {
System.out.println("展示前三种摆法");
queens queen = new queens(queensnumber);
}
} catch (Exception e) {
System.out.println("输入不对");
}
} public queens(int queensnumber) {
cols = new int[queensnumber];
getArrangement(0, queensnumber);
System.out.println(queensnumber + "皇后问题有" + num + "种摆放方法。");
} public void getArrangement(int n, int queensnumber) { // 遍历该列全部不合法的行,并用rows数组记录,不合法即rows[i]=true
boolean[] rows = new boolean[queensnumber];
for (int i = 0; i < n; i++) {
rows[cols[i]] = true; // 摆放了设置为true
int d = n - i;
if (cols[i] - d >= 0)
rows[cols[i] - d] = true;
if (cols[i] + d <= queensnumber - 1)
rows[cols[i] + d] = true;
}
for (int i = 0; i < queensnumber; i++) {
// 推断该行是否合法
if (rows[i])
continue;
// 设置当前列合法皇后所在行数
cols[n] = i;
// 当前列不为最后一列时
if (n < queensnumber - 1) {
getArrangement(n + 1, queensnumber);// 递归
} else {
// 累计方案个数
num++;
// 打印
print();
}
}
} public void print() { if (num >= 4) // 打印前三中方案
{
return;
} else {
System.out.println("第" + num + "种摆法 ");
for (int i = 0; i < queensnumber; i++) {
for (int j = 0; j < queensnumber; j++) {
if (i == cols[j]) {
System.out.print("Q ");
} else
System.out.print("* ");
}
System.out.println(" ");
}
}
}
}
结果例如以下:
四皇后:
八皇后
为了实现因材施教的目标,现教务处计划对学生进行摸底并分类,假如使用K均值聚类算法,而且觉得学生大概能够分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。如今你是该项目的负责人,(1)请设计一个较为完整的项目实施方案;(2)你是否认可对学生进行分类?(3)依照你给定的实施方案与须要測量的要素(如天学习时间),请尝试依照自身情况对其进行回答,以及对自身的评价与定位和努力目标。
分析思路:由于我们是採用k均值聚类算法,以下就是该算法的步骤,那么我们就应该依据步骤来开展和实施。
K-means聚类算法的一般步骤:
- 初始化。输入基因表达矩阵作为对象集X,输入指定聚类类数N,并在X中随机选取N个对象作为初始聚类中心。设定迭代中止条件,比方最大循环次数或者聚类中心收敛误差容限。
- 进行迭代。依据相似度准则将数据对象分配到最接近的聚类中心,从而形成一类。初始化隶属度矩阵。
- 更新聚类中心。然后以每一类的平均向量作为新的聚类中心,又一次分配数据对象。
- 重复运行第二步和第三步直至满足中止条件。
(1)详细的实施方案:1、准备工作:在我们确定开展这项活动后,首先我们要进行对象的选取形成对象集X,这里我们的对象就是学校的学生,然后我们要进行指定聚类类数N,这个就是我们将学生分成哪几种类型,以及类型的总数。之后,我们就能够从x随机抽取N个对象(学生)作为聚类的中心,设定对应的迭代中止条件。
2、进行迭代,我们開始对我们的对象进行大量的实际调查,得到对应的数据,然后依据相似度准则将数据对象分配到最接近聚类中心,从而形成一类,初始化隶属度矩阵。实际上这个做的就是将收集后的数据通过迭代的方式进行分类,达到我们对几种不同学生数据的分类。
3、更新聚类中心,然后以每一类的平均量作为新的聚类中心,又一次分配数据对象。这个的优点就是通过调查统计过程中的实时数据来不断的更新我们的实施方案,能够降低统计的出错率。
4、重复进行第二第三步,达到中止条件为止。也就是我们在开展调查时,数量达到一定量(预估足够完毕我们的统计工作,事先设立的,我们就能够停止调查工作。)
详细的实施过程中,我们能够调查同学的“天学习时间、天游戏时间、上课时间、去图书馆时间、參加社团活动时间、看课外书时间…………
有了上面的这样的思路,我们开展这个调查的方式能够通过的方式有:网上问卷调查,实地跟踪问卷调查。为了达到每一个人參与的效果我们能够把这个加到教务系统的教学评估模块,对大家进行评判。为了能够正确的理解和正确的态度来完毕这个调查,前期一定要做好相关的宣传工作,否则收取不到可靠的数据资料,我们的调查将会大打折扣。
(2)假设这个分类仅仅是作为一个调查,然后依据调查来开展教学活动的话是能够的,这对学生进行分类,并非对学生进行369等的来进行分类和对待。可是我们也应该要有较多的注意事项,比方匿名工作,保护学生的隐私。假设将来开展活动,老师等人要抱着一种同等对待学生的眼光。因此,我们不能大肆的贴上学生类型到个人标签上,这样不利学生的发展。
(3)自身的评价:
天学习时间
1、上课时间:3小时
2、课外完毕作业时间:1小时
3、看课本书:0.2小时
4、其它学习时间:2小时
娱乐时间
1、体育运动:0.3小时
2、看新闻、电视剧、电影:2小时
学生工作时间
1、协助老师完毕工作:0.5小时
2、班级、社团学生会:0.5小时
生活起居时间
1、起床:0.5小时
2、吃饭:1小时
……
自我评价:总的来说,我是一个较为踏实的人,不玩游戏,參加活动比較积极的人。每天都感觉自己有比較多的事情在忙,较为充实。可是专业知识还不够扎实,专业动手能力较差。尽管如今已经是大三了,时间不怎么多,可是自己还是会坚持的学下去。尽自己最大的能力来提高自己。假设要用上面四种类型来限定自己的话,我好想哪一种都不属于,由于我认为我有时主动,有时又不主动,学习态度端正,但并非那种学霸,学习能力特别强。我不玩游戏,也有一定的目标。给自己一个类型的话:我认为我是一个踏实上进型。
第1次实验——NPC问题(回溯算法、聚类分析)的更多相关文章
-
计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)
实验课安排 地点: 科技楼423 时间: 计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家 ...
-
46. Permutations 回溯算法
https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...
-
ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))
这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...
-
c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
-
8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
-
8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
-
回溯算法之n皇后问题
今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...
-
回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
-
Sicily-1152 回溯算法
一.题意: 走日字,每个位置都有有8种新位置,从起点开始刚好过29步遍历其他位置一遍. 二.代码 // // main.cpp // Sicily-1152 回溯算法 // // Created by ...
随机推荐
-
【转】 svn 错误 以及 中文翻译
直接Ctrl+F 搜索你要找的错 # # Simplified Chinese translation for subversion package # This file is distribute ...
-
JavaWeb学习笔记(一)Mac 下配置Tomcat环境
最近,想鼓捣与服务器端的交互,只能自己搭建环境了. 上个周一鼓捣了一点,周五再鼓捣,发现忘得已经差不多了.好记性不如烂笔头,还是记录下来比较好. 首先,去Tomcat的官网,下载Mac版的Tomca ...
-
iOS - 数组(NSArray)
1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s ...
-
皴linux rootpassword(方式:重置rootpassword)
皴linux rootpassword: 开机后,.点击"e"进入维护模式.选"内核选项",例如,看到下面的数字: watermark/2/text/aHR0c ...
-
7.nginx伪静态规则
网上收集的一些常用的,要用的时候就仿照一下,或直接拿来用. WordPress伪静态规则 location / { index index.html index.php; if (-f $reques ...
-
ps删除或覆盖内容
除了选区删除.复制选区内容覆盖之外另外一种方法. 删掉字母"PS": 1. 矩形框选工具在字母上方画出选区 2. Ctrl+T,并拖拽底部以覆盖字母 3. 完成
-
ubuntu安装QGIS
参考官网https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu 但是官网写的太繁琐分散,没有按每个OS集中写cli安装完整过 ...
-
python 集成cython &;&; push 测试pip 仓库
昨天创建了一个简单的python 集成cython 的项目 master 但是有几个问题 目前的构建时基于make 同时需要本地执行,为了方便基于pip 的安装,做了如下调整 项目准备 项目使用ven ...
-
raw格式和qcow2格式
Raw: "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使 ...
-
Delphi中比较两个对象是否一致及地址是否相同[转]
在delphi中,C#也是如此,对象的地址与对象变量(引用)的地址不是同一个概念.要加以区别. procedure TForm1.btn1Click(Sender: TObject); var ...