(1)八皇后及N皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。
package Queen;
public class Queen
{
// 同栏是否有皇后,1表示有
private int[] column;
// 右上至左下是否有皇后
private int[] rup;
// 左上至右下是否有皇后
private int[] lup;
// 解答
private int[] queen;
// 解答编号
private int num;
private int t;
int q = 0;
public Queen()
{
column = new int[8+1];
rup = new int[2*8+1];
lup = new int[2*8+1];
for(int i = 1; i <= 8; i++)
column[i] = 1;
for(int i = 1; i <= 2*8; i++)
rup[i] = lup[i] = 1;
queen = new int[8+1];
}
public void backtrack(int i)
{
if(i > 8)
{
t++ ;
if(t < 4)
{
showAnswer();
}
q = t;
}
else
{
for(int j = 1; j <= 8; j++)
{
if(column[j] == 1 && rup[i+j] == 1 && lup[i-j+8] == 1)
{
queen[i] = j;
// 设定为占用
column[j] = rup[i+j] = lup[i-j+8] = 0;
backtrack(i+1);
column[j] = rup[i+j] = lup[i-j+8] = 1;
}
}
}
}
void Sum()
{
System.out.println("共解出"+q+"种结果.");
}
protected void showAnswer()
{
num++;
System.out.println("\n解答 " + num);
for(int y = 1; y <= 8; y++)
{
for(int x = 1; x <= 8; x++)
{
if(queen[y] == x)
{
System.out.print(" Q");
}
else
{
System.out.print(" X");
}
}
System.out.println();
}
}
public static void main(String[] args)
{
Queen queen = new Queen();
queen.backtrack(1);
queen.Sum();
}
}
延伸到n皇后问题:
package Queen;
import java.util.Scanner;
public class Nqueen {
// 同栏是否有皇后,1表示有
private int[] column;
// 右上至左下是否有皇后
private int[] rup;
// 左上至右下是否有皇后
private int[] lup;
// 解答
private int[] queen;
// 解答编号
private int num;
private int n;
public Nqueen(int n)
{
this.n = n;
column = new int[n+1];
rup = new int[2*n+1];
lup = new int[2*n+1];
for(int i = 1; i <= n; i++)
column[i] = 1;
for(int i = 1; i <= 2*n; i++)
rup[i] = lup[i] = 1;
queen = new int[n+1];
}
public void backtrack(int i)
{
if(i > n)
{
showAnswer();
}
else
{
for(int j = 1; j <= n; j++)
{
if(column[j] == 1 && rup[i+j] == 1 && lup[i-j+n] == 1)
{
queen[i] = j;
// 设定为占用
column[j] = rup[i+j] = lup[i-j+n] = 0;
backtrack(i+1);
column[j] = rup[i+j] = lup[i-j+n] = 1;
}
}
}
}
void Sum()
{
System.out.println("共解出"+num+"种结果.");
}
protected void showAnswer()
{
num++;
System.out.println("\n解答 " + num);
for(int y = 1; y <= n; y++)
{
for(int x = 1; x <= n; x++)
{
if(queen[y] == x)
{
System.out.print(" Q");
}
else
{
System.out.print(" X");
}
}
System.out.println();
}
}
public static void main(String[] args)
{
System.out.println("请输入皇后数量n:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(n+"皇后的结果是:");
Nqueen queen = new Nqueen(n);
queen.backtrack(1);
queen.Sum();
}
}
为了实现因材施教的目标,现教务处计划对学生进行摸底并分类,假如使用K均值聚类算法,并且认为学生大概可以分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。现在你是该项目的负责人,(1)请设计一个较为完整的项目实施方案;(2)你是否认可对学生进行分类?(3)按照你给定的实施方案与需要测量的要素(如天学习时间),请尝试按照自身情况对其进行回答,以及对自身的评价与定位和努力目标。
(1)主要类型" 积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”;完全可以对其兴趣爱好,生活习惯,生活时间安排情况,等方面进行调差分析,通过问卷调查,咨询其他同学进行排查分类.(2)认可
(3)我对3d动画设计比较有兴趣,有时候看一些有价值的课外书,日常生活时间大多是对着电脑,有时候玩游戏,看电影,有时候是学习3d动画设计.我觉得我并不属于以上4种类型.我是一个比较有目标,但主动性不够强的类型.