第1次实验——NPC问题(回溯算法、聚类分析) N皇后的问题

(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种方案。


(2)学生聚类分析思考(PPT,PDF)

    为了实现因材施教的目标,现教务处计划对学生进行摸底并分类,假如使用K均值聚类算法,并且认为学生大概可以分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。现在你是该项目的负责人,(1)请设计一个较为完整的项目实施方案;(2)你是否认可对学生进行分类?(3)按照你给定的实施方案与需要测量的要素(如天学习时间),请尝试按照自身情况对其进行回答,以及对自身的评价与定位和努力目标。

答:可以使用问卷星对学生调查,具体需要测量的因素,如学习时间,游戏时间,平时的兴趣爱好,作业完成程度,是否经常去图书馆等。

同时我认为学生不应该有三六九等之分,每个人都是平等的,他们已经是大学生,老师所能做的也只能是引导他们走向成功,这项调查不宜执行,因为每个人都想往好的方向走,给他定义一个差的头衔,谁都不愿意。

对于以前的我,尽管大一,大二都是班里的第一,也都拿到了校一等奖学金。但我不认为我是一个好学生,依然玩过来的。因为要决定考研,每天几乎没有了游戏的时间,虽然比较累,但会很充实。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值