1 条题解

  • 0
    @ 2025-8-24 22:39:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Give_up
    **

    搬运于2025-08-24 22:39:17,当前版本为作者最后更新于2022-08-06 20:40:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    注意这题 xxyy 要反着读!

    题目思路

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

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

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

    接下来就遍历一遍,每个 a[i][j]a[i][j] 加上所对应的 b[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; 
    }
    
    • 1

    信息

    ID
    7669
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者