AcWing 3149. 打印十字图
原题链接
简单
作者:
ye_che
,
2021-04-13 17:10:21
,
所有人可见
,
阅读 8
#include<bits/stdc++.h>
using namespace std;
const int N = 50000;
struct{
int x, y;
bool h;
}point[N];
int n;
int fanwei;
int meihang;
int getn(int x, int y)
{
return (fanwei-y)*meihang + (x+fanwei);
}
int main()
{
cin >> n;
// 初始化
fanwei = 2 * n + 2;
meihang = 2 * fanwei + 1;
for(int i = -fanwei; i <= fanwei; i ++)
for(int j = -fanwei; j <= fanwei; j ++)
point[getn(i,j)] = {i,j,false};
// -45到45度
point[getn(0,0)].h = point[getn(1,0)].h = point[getn(2,0)].h = true;
for(int i = 1; i <= n; i ++)
{
// 染第i层
int ranse = 2 * i;
for(int j = -(ranse); j <= ranse; j ++)
point[getn(2*i+2,j)].h = true;
point[getn(2*i,2*i)].h = true;
point[getn(2*i,-2*i)].h = true;
point[getn(2*i+1,2*i)].h = true;
point[getn(2*i+1,-2*i)].h = true;
}
// 45 到 90度
for(int i = 1; i <= fanwei; i ++)
for(int j = 0; j <= i; j ++)
if(point[getn(i,j)].h)
point[getn(j,i)].h = true;
// -90 到 -45
for(int i = -1; i >= -fanwei; i --)
for(int j = 0; j <= -i; j ++)
if(point[getn(j,-i)].h)
point[getn(j,i)].h = true;
// 90 到 270
for(int i = - fanwei; i < 0; i ++)
for(int j = -fanwei; j <= fanwei; j ++)
if(point[getn(-i,j)].h)
point[getn(i,j)].h = true;
for(int j = fanwei; j >= -fanwei; j --)
{
for(int i = -fanwei; i <= fanwei; i ++)
if(point[getn(i,j)].h)printf("$");
else printf(".");
cout << endl;
}
return 0;
}