施肥(C++) 难度:初阶

由于题目太长不好截图一张,就截图了两张,请指教,谢谢。
剩下文字凑字数用(12345678910)

img

img

用一个二维数组记录是否被施肥过,根据施肥点和距离设置标记,最后统计即可。
运行结果:

img

代码

#include <iostream>
using namespace std;

int main()
{
    char flag[10001][10001] = { 0 }; //记录是否被施肥
    int n, m;
    int posx, posy; //施肥点
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        cin >> posx >> posy; //输入施肥点
        //根据距离处理flag
        int x = posx - 1;
        int y = posy - 1; //得到下标
        flag[x][y] = 1;
        //直线距离上的点,左侧
        if (x - 2 >= 0)
        {
            flag[x - 2][y] = 1;
            flag[x - 1][y] = 1;
        }
        else if (x - 1 >= 0)
            flag[x - 1][y] = 1;
        //直线距离上的点,右侧
        if (x + 2 < n)
        {
            flag[x + 1][y] = 1;
            flag[x + 2][y] = 1;
        }
        else if (x + 1 < n)
            flag[x + 1][y] = 1;
        //直线距离上的点,上方
        if (y - 2 >= 0)
        {
            flag[x][y - 2] = 1;
            flag[x][y - 1] = 1;
        }
        else if (y - 1 >= 0)
            flag[x][y - 1] = 1;
        //直线距离上的点,下方
        if (y + 2 < n)
        {
            flag[x][y + 2] = 1;
            flag[x][y + 1] = 1;
        }
        else if (y + 1 < n)
            flag[x][y + 1] = 1;

        //判断斜线距离
        int xs = x - 1 >= 0 ? (x - 1) : 0;
        int xe = x + 1 < n ? (x + 1) : (n-1);
        int ys = y - 1 >= 0 ? (y - 1) : 0;
        int ye = y + 1 < n ? (y + 1) : (n - 1);
        for (int k=xs; k <= xe; k++)
        {
            for (int q = ys; q <= ye; q++)
                flag[k][q] = 1;
        }
    }
    int nmb = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (flag[i][j] != 0)
                nmb++;
        }
    }
    cout << nmb;
    return 0;
}

题目都不发出来的吗,只提供测试用例没用啊

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632