第一次实验作业(NPC问题----回溯算法,聚类分析)

(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();
		}
}


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

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

(1)主要类型" 积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”;完全可以对其兴趣爱好,生活习惯,生活时间安排情况,等方面进行调差分析,通过问卷调查,咨询其他同学进行排查分类.

(2)认可

(3)我对3d动画设计比较有兴趣,有时候看一些有价值的课外书,日常生活时间大多是对着电脑,有时候玩游戏,看电影,有时候是学习3d动画设计.我觉得我并不属于以上4种类型.我是一个比较有目标,但主动性不够强的类型.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值