题目其实很简单,关键是怎么建立坐标系
可以以中心为原点,建立一个x,y轴夹角为60度的平面坐标系
于是这道题就很像小学的回形矩阵,只是有六种方向
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <utility>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#include <deque>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define LL long long
#define Pair pair<int,int>
#define LOWBIT(x) x & (-x)
using namespace std;
const int MOD=1e9+7;
const int INF=0x7ffffff;
const int magic=348;
const int zero=200;
int n;
int cnt[6];bool f[6];
int a[500][500];
int main ()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
if (n==1)
{
cout<<1<<endl;
continue;
}
int k,i=zero,j=zero,dir=1,m,minn,mpos;
memset(cnt,0,sizeof(cnt));
memset(a,0,sizeof(a));
a[zero][zero]=1;
cnt[1]=1;i=zero;j=zero+1;
for (k=2;k<=n;k++)
{
memset(f,true,sizeof(f));
minn=INF;
f[a[i][j+1]]=false;f[a[i-1][j]]=false;
f[a[i-1][j-1]]=false;f[a[i][j-1]]=false;
f[a[i+1][j]]=false;f[a[i+1][j+1]]=false;
for (m=1;m<=5;m++)
if (f[m] && cnt[m]<minn)
{
minn=cnt[m];
mpos=m;
}
a[i][j]=mpos;
cnt[mpos]++;
if (k==n) continue;
if (dir==1)
{
if (i+1==j && i==zero)
{
i--;j--;
dir=2;
continue;
}
if (i+1==j)
{
i--;
dir=6;
continue;
}
j++;
}
if (dir==2)
{
if (j==zero)
{
j--;
dir=3;
continue;
}
i--;j--;
}
if (dir==3)
{
if (i==j)
{
i++;
dir=4;
continue;
}
j--;
}
if (dir==4)
{
if (i==zero)
{
i++;j++;
dir=5;
continue;
}
i++;
}
if (dir==5)
{
if (j==zero)
{
j++;
dir=1;
continue;
}
i++;j++;
}
if (dir==6)
{
if (i==zero)
{
i--;j--;
dir=2;
continue;
}
i--;
}
}
printf("%d\n",a[i][j]);
}
return 0;
}