[HDU-6862] Hexagon【构造】
题意
遍历一个半径为 r r r 的平铺六边形中每个小六边形恰好一次,问最多拐多少次弯?
左:半径的定义 右:方向的定义
思路
如下构造:
可以看到,每圈都以4开头,以3结尾,之间是6组两个方向的重复,依此构造即可。(偶数中间转一圈就行了)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int mp[10][2];
void print(int r) // 半径
{
printf("4");
printf("%d", mp[1][1]);
for(int i = 1; i <= r - 3; i ++)
printf("%d%d", mp[1][0], mp[1][1]);
printf("%d", mp[2][1]);
for(int i = 1; i <= r - 2; i ++)
printf("%d%d", mp[2][0], mp[2][1]);
printf("%d", mp[3][1]);
for(int i = 1; i <= r - 2; i ++)
printf("%d%d", mp[3][0], mp[3][1]);
printf("%d", mp[4][1]);
for(int i = 1; i <= r - 2; i ++)
printf("%d%d", mp[4][0], mp[4][1]);
printf("%d", mp[5][1]);
for(int i = 1; i <= r - 2; i ++)
printf("%d%d", mp[5][0], mp[5][1]);
printf("%d", mp[6][1]);
for(int i = 1; i <= r - 2; i ++)
printf("%d%d", mp[6][0], mp[6][1]);
printf("3");
}
void solve(int n)
{
int cnt = 0;
if(n % 2 == 0)
{
cnt = 4;
printf("512345");
}
else
{
cnt = 3;
}
for(int r = cnt; r <= n; r += 2)
{
print(r);
}
printf("\n");
}
void init()
{
mp[1][0] = 1;
mp[1][1] = 3;
mp[2][0] = 6;
mp[2][1] = 2;
mp[3][0] = 5;
mp[3][1] = 1;
mp[4][0] = 4;
mp[4][1] = 6;
mp[5][0] = 3;
mp[5][1] = 5;
mp[6][0] = 2;
mp[6][1] = 4;
}
int main()
{
init();
int T;
cin >> T;
while(T--)
{
int n;
cin >> n;
solve(n);
}
return 0;
}