Lab1 Report

仅保留了参考价值比较大的部分实验内容。

1 实验目标概述

2 实验环境配置

3 实验过程

3.1Magic Squares

n阶幻方是n×n数在方格中的排列,通常是独立的,使得所有行中的n个数、所有列的n个数以及两个对角线都等于同一个常数。

3.1.1 isLegalMagicSquare()

实验任务:判断给定文件内容是否为幻方。
实验思路
文件的读入和切割处理

  1. · 以字符串形式按行读入测试文件,文件采用相对路径; · 用.append(s+"\n")方法还原文件总格式;
  2. 调用String.split(),对按”\n”分割,存到Map[][]二维数组作为它的每一行; ·
  3. 再针对每一行调用String.split(),对按”\t”分割,存到Map[][]二维数组作为它相应行的列元素,此时如果不是/t分割提示不满足分割规则;

//注:对于文件的读写和切割总结了一篇blog:https://blog.csdn.net/CynthiaLLL/article/details/104849571

至此字符串型二维矩阵准备完毕,下面是其他条件判断

  1. · 方阵的判断:根据java中矩阵的存储方式,可以判断矩阵的行数Map.length和列数Map[i].length是否相等
  2. 正整数的判断:调用Integer.parseInt()方法将矩阵转化为int内容方阵,并以此判断其中是否有非正整数元素
  3. 设置int数组分别存放每一行、列及对角线和; 先在行、列、对角线内部比较,判断是否相等; 再将行、列、对角线相互比较,判断是否相等。

至此MagicSquare的判断完毕
以上任何条件不满足都直接以false返回,当条件全部满足时返回true。

3.1.2 generateMagicSquare()

  • 奇数矩阵时依次填入1到n^2,第一个填在第一行正中间,依次向上和向右移动一位,顺序填写,第一行向上会到最后一行,最右向右会到最左,每填n个数,下一个数填在该数下面。
  • 对于违法输入,可以采取if条件判断,也可以用try-catch检测异常。

3.2 Turtle Graphics

3.2.4 Problem 6: Calculating Bearings

3.2.4.1 public static double calculateBearingToPoint
计算当前向量转过多少度后达到目标向量。其中当前向量由当前点、当前方向决定,目标方向由当前点、目标点决定,当前方向由当前方向与y轴正方向的夹角表示,目标向量的方向由当前点与目标点的连线与y轴正方向的夹角表示。
  1. 求当前点与目标点的连线与y轴夹角的正切值,tan=(targetX-currentX)/(targetY-currentY);
  2. 调用Math库中的atan2将其转化为角度,即为当前向量与y轴正方向的夹角;
  3. 减去currentBearing(当前方向),得解。

//作差的结果为负数时需要+360转化为正角。

3.2.4.2 public static List calculateBearings

对相邻两个点调用3.2.4.(1)的函数求夹角,保存在列表中,返回该列表。

3.2.5 Problem 7: Convex Hulls

凸包问题,给出一组点的坐标,求最少的点的集合,使其他所有点都在这些点围成的闭合凸多边形内。

使用gift-wrapping算法:

  1. 扫描list列表,找最左下点作为基点,并加入凸包集合中;
  2. 调用夹角计算的函数,找顺时针夹角最小的中继点,加入凸包集合;
  3. 再找后继点B,加入凸包集合;
  4. 将中继点设为起点、后继点设为中继点,依次循环查找直到新找到的点与初始基点。

//每次查找范围为凸包集合以外的点;
//多点平行于y轴时,若要取这个向量,注意中间点忽略的情况判断。

3.3 Social Network

3.3.1设计/实现FriendshipGraph类

  • private List namelist = new ArrayList<>();
  • public boolean addVertex(Person person) //插入结点,注意可能存在的重名情况
  • public boolean addEdge(Person p1, Person p2)//连接p1->p2,注意判断p1、p2的存在性及可能存在的重复连接情况
  • public int getDistance(Person p1, Person p2)//获取p1到p2的最短路径,注意判断p1和p2的存在性
    BFS算法

3.3.2 设计/实现Person类

String name;//名字
List<Person> friends=new ArrayList<Person>();//朋友关系列表
boolean visited=false;//用于BFS计算最短路径的标记
public Person(String name) {
		this.name=name;
}
public void add_friend(Person new_friend) //在朋友关系列表中添加一个新朋友
public List<Person> get_friends()//返回当前结点的friends属性

3.3.4 设计/实现测试用例

  • 加点
    • 重复加点
  • 建立关系
    • 单人不存在时建立关系
    • 双人不存在时建立关系
    • 重复建立关系
  • 测试最小距离
    • 常规最小距离
    • 单人不存在时的最小距离
    • 双人不存在时的最小距离
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值