题意:给你10个符号,8种旋转与翻转,求最后的图形。
题解:我们只需要维护坐标的变化就可以了,由于坐标的变化x或y可以表示为四种参数a*n+b*i+c*c+d,所以我们用一个两个一维矩阵,维护x与y的变化。
然后对于符号来说,直接改变符号模拟就可以了。
AC代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char a[105][105],op[1000005],ans[105][105];
char c[7]="<>-|/\\",bj[11]="-/<>\\^ovx|",C[11]="-/<>\\^ovx|";
int mp[205],mmp[205];
char change[6][11]={
"|\\v^/<o>x-",
"|\\^v/>o<x-",
"-\\<>/vo^x|",
"-\\></^ovx|",
"|/v^\\>o<x-",
"|/^v\\<o>x-"
};
struct node
{
int p[4];
}now[2];
void fu(node& a)
{
for(int i=0;i<4;i++)
a.p[i]=-a.p[i];
}
int main()
{
for(int i=0;i<6;i++)
mp[c[i]]=i;
for(int i=0;i<10;i++)
mmp[bj[i]]=i;
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<4;i++)now[0].p[i]=now[1].p[i]=0;
now[0].p[1]=now[1].p[2]=1;
for(int i=0;i<10;i++)bj[i]=C[i];
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
getchar();
gets(op);
int l=strlen(op);
for(int i=0;i<l;i++)
{
if(op[i]==' ')continue;
int pos=mp[op[i]];
if(pos==0||pos==1||pos==4||pos==5)swap(now[0],now[1]);
if(pos==0||pos==2||pos==4)fu(now[0]),now[0].p[0]++,now[0].p[3]++;
if(pos==1||pos==3||pos==4)fu(now[1]),now[1].p[0]++,now[1].p[3]++;
for(int j=0;j<10;j++)bj[j]=change[pos][mmp[bj[j]]];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int dx=n*now[0].p[0]+i*now[0].p[1]+j*now[0].p[2]+now[0].p[3];
int dy=n*now[1].p[0]+i*now[1].p[1]+j*now[1].p[2]+now[1].p[3];
ans[dx][dy]=bj[mmp[a[i][j]]];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%c",ans[i][j]);
printf("\n");
}
}
}