题目
[USACO1.2] 方块转换 Transformations - 洛谷
本质上是大模拟,思路比较简单,但是写代码的过程中发现还是存在很多问题,整个写代码加调试花了快两个小时,自己果然是个蒟蒻。
现在总结反思一下。
首先,旋转90°,180°,270°等变换实质是就是找i和j的变化
90°旋转:tmp[j][n-i]=a[i][j]
180°旋转:tmp[n-i][n-j]=a[i][j]
270°旋转:tmp[n-j][i]=a[i][j]
反射:tmp[i][n-j]=a[i][j]
犯错的点
1.旋转i,j变化错了
应该在草稿纸上多演练几次
2.组合变换时,一开始写的是
fanshe()
if(r90()) return 1;
其实这样还是相当于只变换了一次r90(),因为是根据a[][]变换得到的tmp[][],第二次旋转90°相当于覆盖了第一次的反射
收获
1.可以写一个show()函数,判断自己做的变化对不对,这样可以解决犯错点1
2.test()函数很好用,要记得边写边排错
不足
组合的代码里,太过于复杂
整个代码也是重复率极高,很复杂(关于重复,想到了C++面向对象)
但是目前还没有想到解决办法,明天再看看。
目前代码
#include<iostream>
using namespace std;
int N,n;
char a[20][20];
char b[20][20];
char tmp[20][20];
char tmp1[20][20];
void show(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
cout<<tmp[i][j]<<' ';
}
cout<<endl;
}
}
int work(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
if(tmp[i][j]!=b[i][j]) return 0;
}
}
return 1;
}
int r90(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[j][n-i]=a[i][j];
}
}
return work();
}
int r180(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[n-i][n-j]=a[i][j];
}
}
return work();
}
int r270(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[n-j][i]=a[i][j];
}
}
return work();//这个一开始掉了
}
int fanshe(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[i][n-j]=a[i][j];
}
}
return work();
}
//这里一开始错了,先fanshe()后r90()其实还是只有r90()
int zuhe(){
fanshe();
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp1[i][j]=tmp[i][j];
}
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[j][n-i]=tmp1[i][j];
}
}
if(work()) return 1;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[n-j][i]=tmp1[i][j];
}
}
if(work()) return 1;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[n-i][n-j]=tmp1[i][j];
}
}
if(work()) return 1;
}
//注:由于前面改变了tmp数组,这里要将它改变回去
int nochange(){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
tmp[i][j]=a[i][j];
}
}
return work();
}
void test(){
fanshe();
show();
}
int main(){
cin>>N;
n=N-1;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
cin>>a[i][j];
}
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
cin>>b[i][j];
}
}
// test();
if(r90()) cout<<1;
else if(r180()) cout<<2;
else if(r270()) cout<<3;
else if(fanshe()) cout<<4;
else if(zuhe()) cout<<5;
else if(nochange()) cout<<6;
else cout<<7;
}
目前代码很复杂,还有待修改提高