P8462题解

· · 题解

注意这题 xy 要反着读!

题目思路

最基本的就按照题目要求走就行了,注意,xy 是从左下角开始计的,会发现和正常的二维数组只有行变了,列没变,只需要把 x 变成 x - n + 1

可以用两个二维数组,一个 a 数组记录第 i 分钟落得 i 个单位的灰,另一个 b 数组记录答案,也就是每一点上灰的数量。

当人走在点上的时候灰是不会落上去的,所以人所在的那个点 b 要清 0

接下来就遍历一遍,每个 a[i][j] 加上所对应的 b[i][j]

思路大概就是这些了,接下来上代码吧。

代码

#include<bits/stdc++.h>
#define N 55

using namespace std;

int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c<'0' || c>'9')
    {
        if(c=='-') f = -1;
        c = getchar();
    }
    while(c>='0' && c<='9')
    {
        x = (x<<3)+(x<<1)+(c^48);
        c = getchar();
    }
    return x*f;
}

int a[N][N],b[N][N];

int main()
{
    int n=read(),m=read(),y=read(),x=read();
    memset(a,0,sizeof(a));
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            b[i][j] = 1;
    x = n-x+1;
    while(m--)
    {
        char c;
        cin >> c;
        b[x][y] = 0;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                a[i][j] += b[i][j];
        if (c=='N') x--;
        if (c=='S') x++;
        if (c=='W') y--;
        if (c=='E') y++;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                b[i][j]++;
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
    return 0; 
}