第十二周
12.10 Mon.
写了一下黄健学长讲过的第六题优化之后的代码:

思路: 键盘输入(x1,y1)(x2,y2)两点之间连线作为斜边存在一个形成的直角三角形,此时求出两个直角边a,b的长度并求取最大公因数t。此时a=a/t,b=b/t,a,b作为直角边所形成的小直角三角形作为“模板”。该小直角三角形的斜边不会经过整点,因此我们在找拐弯后的第一个整点时就可以利用这个“模板”来求。省去了寻找并判断y是否为整数和类型。
计算(x,y)时只需分别加上或减去模板三角形的两条直角边。上周的周报里写到在拐点处的走向有四种判断,这里求x,y分别只需要一个公式就可以。x=x2+b;y=y2-a;两点形成的线段可以看做是带有方向的线段,那么求取最小三角形也是具有方向的,所以不管怎么走都满足上面的公式。
上面情况不包括两点之间线段垂直或平行于坐标轴的情况,所以仍需加上这种情况出现的可能。
12.11 Tues.
校赛的第一题看似简单,但实则存在很多陷阱。比如:
题中说输入排好序的数组并没有明确说明是正序还是倒序,只是单纯的要求去掉重复的数字,并不需要对数组进行排序。
题中说包含多组数据,并不是只处理一组数。准确意思是输入n个数,再输入-1时对该组数处理并在下一行输出结果。接着还能够输入第二组想要处理的数据,在输入-1时能够再处理并输出···
所以,我又重新做了一下第一题:

在之前的基础上,在最外层多加了一个while循环。当每个数组输完之后都会输入一个-1,此时可以令-1既是上个数组的结束指令也是下个数组进行再次处理的指令。
最开始定义m=-1,while(m==-1)时则进入循环体,进行处理。因为每次输入数组的末尾都需要输入-1,所以while循环体会一直有效并执行。
在每次处理完一组数组之后(最后一个for循环)会“清空”数组。避免与下一组数据冲突。
12.12 Wed.
晚上瞿学长给我讲了一下K-mean算法,然后讲了一些关于MATLAB的基本使用。
矩阵绘图:给出A矩阵后,x=1:3:15表示从第1个元素值开始到第15个元素值,每次步数为3.同样的y也是。plot是将x,y对应的元素定义的点依次用实线连接起来,这里向量x,y的维数必须相同。

注意:
不想输出的值在后面加“;”
for循环和if条件语句的使用都需要用end来结尾,并层次对应。
在MATLAB里面没有i++的使用只能用i=i+1来表示。
12.13-12.14 Thur-Fri.
晚上做数据。
12.15 Sat.
做了一下之前没做出来的第四周题目:



思路: 20*20的像素为一个字,共有六个字的信息需要“翻译”。可以看作是一个字需要占20*20的数组。因此需要建立一个20*120的数组来存放六个字所有的二进制的信息。
fun函数的调用使键盘输入的数字转换为二进制数并存入数组的每行,r=j+19和r>=j表示一个结果占20列。
主函数中j表示列,j从0开始到19存放第一个字的信息,当第一个字存完后,令j+=20,从20开始存放第二个字的信息,以此类推···当j=100时开始存放最后一个字,存完之后跳出循环输出结果。
后来用MATLAB尝试做这道题:


B=fun(A)将A矩阵输进去之后在fun函数里面处理。思路与上面C语言写的相同。
注意:
rem(x,y):求整除x/y的余数
floor(x)负方向取整(例:floor(pi)=3)
ceil(x)正方向取整(例:ceil(pi)=4)
round(x)四舍五入
因为MATLAB存储数值的类型都为double型,但题中需要处理的数值全部是正整数且除法过后需要负方向取整,所以用floor函数。
定义函数:需要定义函数名,输入变量和输出变量。
若只取A矩阵中的第一行做处理则表示为B=fun(A(1,:)
12.16 Sun


MATLAB绘图结果:

一开始出现的结果是反向的,后来把转换后的二进制数存放的顺序修改了一下。
scatter(x,y,S,C)中x,y表示数据;S为大小一般默认为50;C为颜色,根据matlab资料上相对应的字符需要加上单引号。
hold on和hold off相对使用,使其间的图像共存。
