AcWing 1113. 红与黑

  • 一、题目链接
  • 二、题目分析
    • (一)算法标签
    • (二)解题思路
  • 三、AC代码
    • 解法一(BFS):
    • 解法二(DFS):
  • 四、其它题解

一、题目链接

AcWing 1113. 红与黑


二、题目分析

(一)算法标签

DFS Flood Fill BFS

(二)解题思路

本题可以用BFS和DFS
输入小trick:

int m, n;
while (cin >> m >> n, m || n)
{}

详细了解搜索类题目(DFS、BFS),请移步DFS BFS 搜索题目归纳


三、AC代码

解法一(BFS):

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 25;char g[N][N];
bool st[N][N];int n, m;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int bfs(PII start)
{memset(st, false, sizeof st);// 当前点遍历过st[start.x][start.y] = true;// 当前点也是黑色int cnt = 1;queue<PII> q;q.push(start);while (!q.empty()){auto t = q.front();q.pop();for (int i = 0; i < 4; i ++ ){int x = t.x + dx[i], y = t.y + dy[i];if (x < 0 || x >= n || y < 0 || y >= m) continue;if (g[x][y] == '.' && !st[x][y]) {cnt ++ ;st[x][y] = true;q.push({x, y});}}}return cnt;
}
int main()
{while (true){cin >> m >> n;if (m == 0) break;for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);PII start;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == '@'){start = {i, j};break;}cout << bfs(start) << endl;}return 0;
}

解法二(DFS):

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 25;char g[N][N];
bool st[N][N];int n, m;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int dfs(int x, int y)
{int cnt = 1;st[x][y] = true;for (int i = 0; i < 4; i ++ ){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (!st[a][b] && g[a][b] == '.'){cnt += dfs(a, b);}}return cnt;
}
int main()
{while (true){cin >> m >> n;if (m == 0) break;for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);int x, y;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == '@'){x = i, y = j;break;}memset(st, false, sizeof st);cout << dfs(x, y) << endl;}return 0;
}

DFS的另一种写法:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 25;char g[N][N];
bool st[N][N];int n, m;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};// 另一种dfs写法
int ans;
void dfs(int x, int y)
{// 如果跑出图了就返回if (x < 0 || x >= n || y < 0 || y >= m) return;// 标记当前点已经搜索过st[x][y] = true;// 每跑一次dfs就代表进来一个新的没跑过的黑格子,所以答案要加一ans ++ ;for (int i = 0; i < 4; i ++ ){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (!st[a][b] && g[a][b] == '.'){dfs(a, b);}}
}int main()
{while (true){cin >> m >> n;if (m == 0) break;for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);int x, y;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == '@'){x = i, y = j;break;}memset(st, false, sizeof st);ans = 0;dfs(x, y);cout << ans << endl;}return 0;
}

四、其它题解

AcWing 1113. 红与黑

AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】相关推荐

  1. 经典问题的另类解法——以信息学奥赛一本通c++版1216红与黑为例

    题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn) 题目描述: 有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动 ...

  2. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  3. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

  4. 移动玩具(信息学奥赛一本通-T1453)

    [题目描述] 在一个 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将 ...

  5. Knight Moves(信息学奥赛一本通-T1450)

    [题目描述] 编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数.骑士一步可以移动到的位置由下图给出. [输入] 第一行给出骑士的数量 n. 在接下来的 3n 行中,每 3 行描述 ...

  6. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  7. 信息学奥赛一本通T1451:棋盘游戏

    信息学奥赛一本通T1451:棋盘游戏 [题目描述] 在一个 4×4 的棋盘上有 8 个黑棋和 8 个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子. 给出一 ...

  8. 信息学奥赛一本通T1453:移动玩具

    信息学奥赛一本通T1453:移动玩具 [题目描述] 在一个 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的 ...

  9. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

最新文章

  1. [算法进阶0x10]基本数据结构C作业总结
  2. 字节AI实习生搞出这个玩意儿,撩到了图灵奖大神,我用了用结果画风逐渐鬼畜起来……...
  3. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
  4. cv2.minAreaRect() 生成最小外接矩形
  5. The credentials you provided during SQL Server 2008 install are invalid
  6. 如何解决padding标记在ie7、ie6以及firefox中的兼容问题
  7. C++/C--内存的四驱模型
  8. 哪些手机搭载鸿蒙,鸿蒙2.0搭载手机吗-有什么功能
  9. pandas及numpy笔记
  10. csdn积分获取办法
  11. TCP/IP报文格式及通讯
  12. 如何把iphone 6s通讯录导入到诺基亚E72i内
  13. STM32采集电流互感器(电流互感器模块)数据
  14. 健康小贴士之缓解眼睛疲劳的方法
  15. 非常规的自我实现——听陆向谦讲创业
  16. ansible一键部署zabbix并配置自动发现
  17. HTML+CSS+JavaScript实现网页广告
  18. maven阿里云中央仓库
  19. 数的机器码表示(原码,反码,补码,移码)
  20. 大数据的价值是如何得以彰显的?

热门文章

  1. 数睿数据2022新年致辞:小荷才露尖尖角,早有蜻蜓立上头
  2. 六进制计数器的设计(详解)
  3. AI领域算法作者及项目直播分享汇总-不断更新ing
  4. 微信公众号申请到开发环境搭建
  5. 【万里征程——Windows App开发】SemanticZoom视图切换
  6. 解析SWD协议,烧写程序
  7. 程序是怎么跑起来的——虚拟内存与动态链接
  8. #2微信小程序错误:音乐API调用音乐URL时出现错误
  9. 3DMAX - 使用编辑多边形的小技巧
  10. Java8 JVM运行时数据区概述 (极其详细长文)