为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

USACO/transform

来自NOCOW
跳转到: 导航, 搜索
这是USACO Chapter 1 .2中的OI题目Transformations介绍及题解,参见 翻译C语言代码C++语言代码Pascal语言代码

目录

[编辑] 分析

设a是原始状态,b是改变后的状态。

水平翻转:

b[i,n-j+1]:=a[i,j]

右旋90度:

b[j,n-i+1]:=a[i,j]

枚举方案就行了,或直接枚举变换。

需要注意的是,USACO是不给用GOTO的。注意代码的清晰程度。

小提示:如果你觉得自己写的程序是对的,但是总是不能AC,那么,试着将它的各个功能分解成一个个子例程, 并逐个验证其正确性,就能迅速发现BUG在哪里。

其实有一个非常不错但是不容易想到的方法:假设读入的字符串是a,可以进行如下操作: 1.将a放入a1的左上角,做水平方向对称,放在a1的右上角。 2.将以上得到的a1的上一半做垂直方向对称,放在a1的下一半。 3.将a1的左上、左下、右上、右下各部分分别做中心对称(可以将整个部分行列互换),存在a2中。 进行以上操作后a2的右上角是#1,a1的右下角是#2,a2的左下角是#3,a1的右上角是#4,a2的右下角、a1的左下角、a2的左上角是#5,a1的左上角是#6。将a分别与八部分进行比较,与哪部分相同就返回那部分对应的值,如果没有则返回7。 (以上内容已经经过验证)

[编辑] 注意

1.在判断5的时候要注意一定是要有一个转换的过程,不能直接在没有中间数组的情况下套公式进行判断,这样可能会造成错误。 2.即使两组图形完全一样,不必经过转换,也必须先试验1-5的转换方法,如果都不行才能输出6,因为题目要求输出编号较小的转换方法

[编辑] 参考代码

C

C++

Pascal

Java

[编辑] 引用

[1]

个人工具