W3 - Red and Black

该博客讨论了一个编程问题,涉及到一个男子在红色和黑色瓷砖构成的长方形房间里移动。男子只能在黑色瓷砖上行走,通过广度优先搜索(BFS)算法计算他能到达的黑色瓷砖总数。博客提供了输入输出示例,并展示了代码实现,包括BFS函数和错误调试过程。
摘要由CSDN通过智能技术生成

题目描述

有一个长方形的房间,覆盖了正方形的磁砖。每块磁砖的颜色,要么是红色,要么是黑色。一名男子站在一块黑色的磁砖上。他可以从一块磁砖移至相邻四块磁砖中的某一块。但是,他不允许在红色磁砖上移动,他只允许在黑色磁砖上移动。
编写一个程序,使得他允许重复上述的移动,判断他所能到达的黑色磁砖的数量。

输入

输入由多个数据集组成。数据集的起始行包含了两个正整数 W 和 H;W 和 H 分别是 x- 和 y- 方向的磁砖数量。W 和 H 不超过 20 。
在数据集中,还有 H 行,每行包含了 W 个字符。每个字符按如下方式表示一块磁砖的颜色。
‘.’ - 一块黑色的磁砖
‘#’ - 一块红色的磁砖
‘@’ - 一名男子,站在一块黑色磁砖上 (在一个数据集中,恰好出现一次)
以包含两个 0 的一行,表示输入结束。

输出

对于每个数据集,程序应当输出一行,包含他从初始磁砖所能抵达的磁砖数量 (包括初始磁砖自身)。

示例输入

6 9
…#.
…#





#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.

11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0

示例输出

45
59
6
13

Code

/*
 * @Description: Red and Black
 * @version:
 * @Author:
 * @Date: 2021-04-14 12:59:46
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2021-04-14 16:52:51
 */
// self
#include <iostream>
#include <queue>
using namespace std;
char room[20][20];
bool flag[20][20];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int count = 0;
struct point
{
    int x;
    int y;
};
void BFS(int w, int h, int indexX, int indexY)
{
    ::count = 0;
    queue<struct point> q;
    struct point temp;
    temp.x = indexX;
    temp.y = indexY;
    q.push(temp);
    flag[indexX][indexY] = true;
    while (!q.empty())
    {
        int x = q.front().x, y = q.front().y;
        for (int i = 0; i < 4; i++)
        {
            int nextX = x + dir[i][0], nextY = y + dir[i][1];
            if (nextX < 0 || nextX >= h || nextY < 0 || nextY >= w)
                continue;
            if (flag[nextX][nextY])
                continue;
            if (room[nextX][nextY] == '#')
                continue;
            temp.x = nextX;
            temp.y = nextY;
            flag[nextX][nextY] = true;
            q.push(temp);
        }
        ::count++;
        q.pop();
    }
}
int main()
{
    int width, height;
    while (cin >> width >> height && (width != 0 || height != 0))
    {
        // 输入数据及初始化标志数组
        int indexX, indexY;
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                cin >> room[i][j];
                if (room[i][j] == '@')
                {
                    indexX = i;
                    indexY = j;
                }
                flag[i][j] = false;
            }
        }
        BFS(width, height, indexX, indexY);
        cout << ::count << endl;
    }
    system("pause");
    return 0;
}
// 提交一次
// 调试中遇到的问题
// 忘记出队列
// 忘记判断坐标是否超出范围
// 忘记置标志数组为true
// 在循环外将count+1,导致count多1
### 回答1: 要使用Node-RED编写一个开关控制的流,您需要按照以下步骤操作: 1. 首先,安装Node-RED的Dashboard插件,这可以通过在Node-RED面板的右上角的菜单中选择“管理面板”,然后选择“Pallete”选项卡并搜索“node-red-dashboard”插件来完成。 2. 在Node-RED的编辑器中创建一个新的流,并添加一个“dashboard”节点。该节点允许您将数据传输到Node-RED的Dashboard插件中。 3. 接下来,添加一个“switch”节点,以便您可以控制开关状态。将开关的状态连接到dashboard节点的输入。 4. 为了更改图标的颜色,您需要使用自定义的SVG图标。可以将SVG图标上传到Node-RED Dashboard插件的图标文件夹中。这个文件夹在Node-RED的安装目录下的“node_modules/node-red-dashboard/dist/icons”文件夹中。 5. 在dashboard节点的设置中,将图标设置为您上传的自定义SVG图标。 6. 最后,您需要将流导出为代码。这可以通过选择右上角的“导出”按钮完成。将代码保存到文件中。 导入代码时,只需将代码复制并粘贴到Node-RED编辑器中的导入窗口即可。导入的流将出现在Node-RED编辑器的左侧面板中,您可以随时使用它。 ### 回答2: 要使用Node-RED编写一个开关控制的流,并使用自定义的SVG图标将其颜色更改为黑色,并在控制面板上显示它,可以按照以下步骤进行操作: 1. 首先,在Node-RED编辑器中创建一个新的流,并在左侧的工具栏中选择"导入"选项。 2. 在弹出的对话框中,将你的流代码粘贴进去,并点击"导入"按钮来导入该流。 ```json [{"id":"a24c8177.17822","type":"ui_template","z":"8f5f047a.7c0ad8","group":"7f11ccec.7effb4","name":"","order":0,"width":"1","height":"1","format":"<style>\n .onoff div svg {\n fill: black !important;\n }\n</style>\n\n<div ng-class=\"{'onoff': msg.payload == 'on', 'fa fa-toggle-off': msg.payload == 'off', 'fa fa-toggle-on': msg.payload == 'on'}\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M14 10.42V4h-4v6.42L5.71 8.3a.996.996 0 0 0-1.41 1.41l5.3 5.29a.996.996 0 0 0 1.41 0l5.3-5.29a.996.996 0 1 0-1.41-1.41L14 10.42zM17 13V3H7v10H5v6h14v-6h-2z\"/>\n </svg>\n</div>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":490,"y":440,"wires":[[]]},{"id":"7f11ccec.7effb4","type":"ui_group","z":"","name":"Default","tab":"8741e4b0.c8e4b","disp":true,"width":"6","collapse":false},{"id":"8741e4b0.c8e4b","type":"ui_tab","z":"","name":"Home","icon":"dashboard"}] ``` 3. 点击"导入"按钮后,你将在编辑器中看到一个包含开关SVG图标的模板节点。它具有自定义的CSS样式,当消息的payload为"on"时将图标的颜色更改为黑色。 4. 将该节点连接至其他逻辑和输出节点,并在你的控制面板上显示该流。 通过以上步骤,你就可以使用Node-RED编写一个开关控制的流,并使用自定义的SVG图标将其颜色更改为黑色,并让它显示在控制面板上。 ### 回答3: Node-RED一个流程编程工具,可以用来快速创建物联网应用程序。下面是一个使用Node-RED编写开关控制的流程,同时使用自定义的SVG图标并将其颜色更改为黑色,然后显示在Node-RED的仪表板上。 首先,打开Node-RED编辑器,在右侧的工具栏中选择并拖动相应的节点到中央的流程编辑区域。 1. 添加一个「开关」节点,用于控制流程的开关状态。 2. 添加一个「改变颜色」节点,用于更改自定义SVG图标的颜色黑色。可以使用CSS或其他方法将SVG的颜色样式更改为黑色。 3. 添加一个「仪表板」节点,用于将开关状态和自定义SVG图标显示在Node-RED的仪表板上。 4. 将这三个节点连接起来,并设置相应的节点属性。例如,可以通过设置「开关」节点的名称和初始状态来控制开关的行为。可以通过设置「改变颜色」节点的SVG图标路径来导入自定义的SVG图标。可以通过设置「仪表板」节点的标签和分组来配置仪表板显示的方式。 5. 单击「部署」按钮来部署流程,并在浏览器中打开Node-RED的仪表板界面。 此时,你将能够在Node-RED的仪表板上看到一个带有自定义SVG图标的黑色开关。点击开关,可以控制开关的状态,并随之改变SVG图标的颜色。 最后,将以上流程导出为Node-RED流程代码,可以将其保存为一个JSON文件,并在需要时导入到Node-RED中。具体的导入导出方法,可以参考Node-RED的官方文档或在线资源。 这样,你就可以使用自定义的SVG图标并将其颜色更改为黑色,并通过Node-RED的仪表板来控制开关的状态了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值