题意:
题解:
结束的位置我们可以直接算出来。当$n$很大的时候,很容易就把一整行(列)填满,所以我们可以倒着做,一次弄完一整行(列)后,直接算出回到哪里,整个地图填满就可以停了。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, cx[2010], cy[2010];
long long s;
char ans[2010][2010];
int main()
{
scanf("%d%d%d%d%lld", &n, &m, &x, &y, &s);
long long tx = x + (s + 1) / 2 * ((s + 1) / 2 % 2 ? -1 : 1), ty = y + ((s - 2) / 4 * 2 + 2) * (s / 2 % 2 ? 1 : -1);
if (s == 1) ty = y;
tx = (tx % n + n) % n;
if (tx == 0) tx = n;
ty = (ty % m + m) % m;
if (ty == 0) ty = m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
ans[i][j] = '.';
ans[tx][ty] = '@';
cx[tx] = cy[ty] = 1;
int ch = (s - 1) % 26, cnt = 1;
for (long long i = s; i > 0 && cnt < n * m; i--, ch = (ch + 25) % 26)
{
// printf("%c\n", ch + 'A');
int step = 0;
if (i & 1) // 竖
{
for (int j = 0; j < i && cy[ty] < n; j++)
{
if (i & 2)
{
tx--;
if (tx == 0) tx = n;
if (ans[tx][ty] == '.')
{
cnt++;
cy[ty]++;
cx[tx]++;
ans[tx][ty] = ch + 'A';
}
}
else
{
tx++;
if (tx > n) tx = 1;
if (ans[tx][ty] == '.')
{
cnt++;
cy[ty]++;
cx[tx]++;
ans[tx][ty] = ch + 'A';
}
}
step++;
}
if (i & 2)
tx = ((tx - (i - step)) % n + n) % n;
else
tx = ((tx + (i - step)) % n + n) % n;
if (tx == 0) tx = n;
}
else
{
for (int j = 0; j < i && cx[tx] < m; j++)
{
step++;
if (i & 2)
{
ty--;
if (ty == 0) ty = m;
if (ans[tx][ty] == '.')
{
cnt++;
cx[tx]++;
cy[ty]++;
ans[tx][ty] = ch + 'A';
}
}
else
{
ty++;
if (ty > m) ty = 1;
if (ans[tx][ty] == '.')
{
cnt++;
cx[tx]++;
cy[ty]++;
ans[tx][ty] = ch + 'A';
}
}
}
if (i & 2)
ty = ((ty - (i - step)) % m + m) % m;
else
ty = ((ty + (i - step)) % m + m) % m;
if (ty == 0) ty = m;
}
// printf("%d\n", step);
}/*
for (int i = 1; i <= n; i++)
printf("%d ", cx[i]);
puts("");
for (int i = 1; i <= m; i++)
printf("%d ", cy[i]);
puts("");*/
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
printf("%c", ans[i][j]);
puts("");
}
}