https://hihocoder.com/problemset/problem/1632
将左边的图按顺序输出成右边的图
大致思路是左右2个指针去填充。
所以要做到知道x,y就知道箭头方向。那么就是看规律了。
对于左边这张图,我们可以看出→和↓都在四周出现,之后通过x与y的和的奇偶来判↗和↙5
对于右图螺旋线,我们和划一个叉叉 ,把它变成四部分,然后就可以看出规律了。。。类似于平面直角坐标系中有2条
直线相交产生的4个扇面,每个扇面都有相应的关于x和y的规律
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
char a[111][111];
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
}
int js=n*n-1;
int lx=1;
int ly=1;
int rx=1;
int ry=1;
char b[111][111];
b[rx][ry]=a[lx][ly];
while(js)
{
js--;
if((lx+ly)%2==0&&lx==1&&ly!=n)
ly++;
else if((lx+ly)%2==1&&lx==n&&ly!=n)
ly++;
else if((lx+ly)%2==1&&ly==1&&lx!=n)
lx++;
else if((lx+ly)%2==0&&ly==n&&lx!=n)
lx++;
else if((lx+ly)%2==1)
lx++,ly--;
else if((lx+ly)%2==0)
lx--,ly++;
if(rx+ry<n+1&&(ry+1)>=rx)
{
ry++;
}
else if(rx+ry>=n+1&&ry>rx)
{
rx++;
}
else if(rx>=ry&&rx+ry>n+1)
{
ry--;
}
else rx--;
b[rx][ry]=a[lx][ly];
//cout<<lx<<" "<<ly<<"->"<<rx<<" "<<ry<<endl;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<b[i][j];
cout<<endl;
}
}
return 0;
}