本文共 1362 字,大约阅读时间需要 4 分钟。
题意很容易理解,思路也是简单的,基本上就是直接模拟。但一开始我怎么也推不出原地旋转的坐标变换表达式(空间想象力不够。。。。。),导致卡了很久。
对于一个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*/#include#include #include #include using namespace std;//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< < >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;}
转载地址:http://pkrfb.baihongyu.com/