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

来源:互联网 发布:js中的九九乘法表 编辑:程序博客网 时间:2024/06/07 00:42

(1)八皇后及N皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

    请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。


import java.util.Scanner;public class NQueen{   public  static int queensnumber;  // 皇后数    public static int num; // 方案数量   public static int []x = new int[20];    public static void main(String[] args)    {        // TODO Auto-generated method stub        NQueen queen = new NQueen();        System.out.println("Input the number of Queens");        Scanner s = new Scanner(System.in);        while (s.hasNext())        {            String line = s.nextLine();            String[] sArray = line.split(" ");            queensnumber = Integer.parseInt(sArray[0]);            if (queensnumber == -1)                return;            else            {                //System.out.println(queen.n);                for (int i = 0; i <= queensnumber; i++)                {                    queen.x[i] = 0;                }                queen.Backtrack(1);            }                 }          }    public boolean Place(int i)  // 行    {        if (i > queensnumber)        {            return false;        }        else        {            for (int j = 1; j < i; j++) // x[]是列,i,j是行            {                if ((Math.abs(j - i) == Math.abs(x[i] - x[j]) || (x[i] == x[j]))) // 只要有一个不行就返回false                {                    return false;                }            }        }        return true;    }    private int Backtrack(int i) // 行    {        if (i > queensnumber)        {            num++;                        print();        }        else        {            for (int j = 1; j <= queensnumber; j++) // 列            {                x[i] = j;                if (Place(i))    // 行                {                    Backtrack(i + 1); // 行                }            }        }        return num;    }    public static 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 == x[j]) {                            System.out.print("Q ");                        } else                            System.out.print("X ");                    }                    System.out.println(" ");                }            }        } }




2.学生聚类分析思考

 学生大概可以分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。

 首先本次通过几个变量来对学生进行分类:

 1)课余学习时间 int整形变量

 2)课余玩游戏时间 int整形变量

 3)课余参加社团活动时间 int整形变量

 4)是否有目标 boolean布尔变量

 5)参与比赛次数 int整形变量


 学生每天的8:10~11:50、14:30~17:55上课,13:00~14:00、23:30~07:00休息,除去吃饭等杂碎的事情,剩余的可调配时间大概5.5个小时~6个小时


 ①积极主动型:

  平均课余学习时间≥2.5个小时

  平均课余游戏时间≤30分钟

  平均课余参加社团活动时间≥1.5小时

  有自己的奋斗目标

  平均每学期参与比赛次数≥1次

 

  ②学霸型

  平均课余学习时间≥4个小时

  平均课余游戏时间≤30分钟

  平均课余参加社团活动时间≤0.5小时

  有自己的奋斗目标

  平均每学期参与比赛次数≤1次

 

 ③游戏人生型

  平均课余学习时间≤0.5个小时

  平均课余游戏时间≥3.5小时

  平均课余参加社团活动时间≤0.5小时

  无自己的奋斗目标

  平均每学期参与比赛次数0次


 ④迷茫无目标型

  平均课余学习时间≤2个小时 && ≥1小时

  平均课余游戏时间2小时 && ≥1小时

  平均课余参加社团活动时间≤1小时

  无自己的奋斗目标

  平均每学期参与比赛次数0次


0 0
原创粉丝点击