1.2Transformations

题意很容易理解,思路也是简单的,,基本上就是直接模拟。但一开始我怎么也推不出原地旋转的坐标变换表达式(空间想象力不够。。。。。),导致卡了很久。 对于一个n*n的矩形(下标从1开始),其中一点(x,y)原地旋转90°后的坐标:(y,n-x+1);原地旋转180°后的坐标:(n-x+1,n-y+1);原地旋转270°后的坐标:(n-y+1,x).得到这个公式后代码就好写了,当然我们其实只需要写一个旋转90°的函数就行了,因为180°就是旋转2次90°吗,270度就是旋转3次90°吗。

代码如下:

/*ID: 15674811LANG: C++TASK: transform*/;//ifstream fin(“lkl.txt”);ofstream fout(“transform.out”);ifstream fin(“transform.in”);int n;char m[12][12],goal[12][12];int check(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(m[i][j]!=goal[i][j])return 0;return 1;}void Rt_90(){char tmp[12][12];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)tmp[j][n-i+1]=m[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)m[i][j]=tmp[i][j];}///水平反射,其实就是关于中轴线对称void Rf(){int k=n/2;for(int i=1;i<=n;i++)for(int j=1;j<=k;j++){int t=m[i][j];m[i][j]=m[i][n-j+1];m[i][n-j+1]=t;}}void solve(){int flag=0;if(check())flag=1;for(int i=1;i<=3;i++){Rt_90();if(check()){fout<<i<<endl;return;}}Rt_90();///再次旋转90度使得矩形复原Rf();if(check()){fout<<“4″<<endl;return;}for(int i=1;i<=3;i++){Rt_90();if(check()){fout<<“5″<<endl;return;}}if(flag){fout<<“6″<<endl;return ;}fout<<“7″<<endl;}int main(){while(fin>>n){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)fin>>m[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)fin>>goal[i][j];solve();} return 0;}

每一个成功者都有一个开始。勇于开始,才能找到成功的路。

1.2Transformations

相关文章:

你感兴趣的文章:

标签云: