tkj
文章143
标签102
分类0
bzoj 5122: [Lydsy1712月赛]彩虹溜冰鞋

bzoj 5122: [Lydsy1712月赛]彩虹溜冰鞋

题意:

题解:

结束的位置我们可以直接算出来。当$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("");
    }
}
本文作者:tkj
本文链接:https://tkj666.github.io/125/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可