(1)八皇后及N皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。
代码实现如下:
package 算法作业;
import java.util.Scanner;
public class NQueen {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入N皇后的N值(阿拉伯数字):");
int n = scan.nextInt();
scan.close();
queen(n);
}
private static void queen(int n) {//参数是代表几皇后的问题
int[] q = new int[n];
int count = 0;//统计一共有多少种结果。
for(int i=0;i<q.length; i++) {
q[i] = 0;
}
int j;
outer:
while(q[0] < q.length) {
for(j=q.length-1; q[j]<q.length; q[j]++) {
if(isQueen(q)) {
count++;
System.out.println("第"+count+"种方案如下:");
show(q);
}
}
while(q[j] == q.length && j>0) {
q[j] = 0;
q[--j]++;
}
continue outer;
}
}
//判断数组中存储的是不是一组皇后。
private static boolean isQueen(int[] arr) {
if(isEquals(arr)) {
return false;
}
for(int i=1; i<arr.length;i++) {
for(int j=0; j<i;j++) {
if(arr[i]+i == arr[j]+j || arr[i]+j == arr[j]+i) {
return false;
}
}
}
return true;
}
//判断是否有两个皇后在同一列上。
private static boolean isEquals(int[] arr) {
int a[] = new int[arr.length];
for (int i=0;i<a.length;i++) {
a[i] = arr[i];
}
java.util.Arrays.sort(a);
for(int i = 0; i < a.length-1 ; i++) {
if(a[i] == a[i+1]) {
return true;
}
}
return false;
}
/*
* 显示N皇后的结果。
*/
private static void show(int[] arr) {
System.out.print(" \t");
for (int i=0; i<arr.length; i++) {
System.out.print(i+"\t");
}
System.out.println();
for(int i=0; i<arr.length; i++) {
System.out.print(i+"\t");
for(int j=0; j<arr.length; j++) {
if(arr[i] == j) {
System.out.print("Q\t");
}else {
System.out.print("X\t");
}
}
System.out.println();
}
}
}
运行结果如下:
本代码可以实现N皇后的任意N值求解。但缺点在于可能时间效率上应该还可以优化。采用的思想有n进制数字相加。然后判断数字的每一位是否恰好满足N皇后的条件。本程序会输出所有的结果,最后一种方案就可以看出八皇后有92种方案。
为了实现因材施教的目标,现教务处计划对学生进行摸底并分类,假如使用K均值聚类算法,并且认为学生大概可以分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。现在你是该项目的负责人,(1)请设计一个较为完整的项目实施方案;(2)你是否认可对学生进行分类?(3)按照你给定的实施方案与需要测量的要素(如天学习时间),请尝试按照自身情况对其进行回答,以及对自身的评价与定位和努力目标。
答:可以使用问卷星对学生调查,具体需要测量的因素,如学习时间,游戏时间,平时的兴趣爱好,作业完成程度,是否经常去图书馆等。
同时我认为学生不应该有三六九等之分,每个人都是平等的,他们已经是大学生,老师所能做的也只能是引导他们走向成功,这项调查不宜执行,因为每个人都想往好的方向走,给他定义一个差的头衔,谁都不愿意。
对于以前的我,尽管大一,大二都是班里的第一,也都拿到了校一等奖学金。但我不认为我是一个好学生,依然玩过来的。因为要决定考研,每天几乎没有了游戏的时间,虽然比较累,但会很充实。