【题目链接】

ybt 1216:红与黑
OpenJudge NOI 2.5 1818:红与黑

【题目考点】

1. 连通块问题

2. 深搜/广搜

【解题思路】

1. 深搜

从第一个格子出发,遍历所有可以前进的方向,前进到下一个格后,再遍历可以前进的方向,走过的格子做标记,标记过的格子就不走了,不是黑色的格子不走。如果没有可以走的格子,那么退回到上一位置,看其它前进方向的格子可不可以走。
每走一个格子,格子计数加1,如果退回,也不减少格子计数。深搜结束后,输出格子计数。

2. 广搜

将起始位置做标记,而后入队。每出队一个位置,看看能从这个位置走到哪些位置,可以走到的位置必须满足3个条件:在地图内,没标记过,是黑色格子。将能从该位置走到的位置做标记,而后入队。继续出队一个位置,循环此过程,直到队空。
每标记一个位置,格子计数加1。广搜结束后,输出格子计数。

【注意】:该题中,w表示宽度,也就是列数。h表示高度,也就是行数。这是一个h行w列的矩阵。

【题解代码】

解法1:深搜

#include <bits/stdc++.h>
using namespace std;
#define N 25
char mp[N][N];//地图
int w, h, ans;//h:行数,w:列数,ans:结果计数
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//方向数组
bool vis[N][N];
void dfs(int sx, int sy)
{for(int i = 0; i < 4; ++i){int x = sx + dir[i][0], y = sy + dir[i][1];if(x >= 1 && x <= h && y >= 1 && y <= w && vis[x][y] == false && mp[x][y] != '#'){ans++;vis[x][y] = true;dfs(x, y);}}
}
int main()
{int stx, sty;//起始位置while(true){cin >> w >> h;if(w == 0 && h == 0)return 0;for(int i = 1; i <= h; ++i)for(int j = 1; j <= w; ++j){cin >> mp[i][j];if(mp[i][j] == '@')stx = i, sty = j;}memset(vis, 0, sizeof(vis));//多组数据,注意状态还原ans = 1;vis[stx][sty] = true;dfs(stx, sty);cout << ans << endl;}return 0;
}

解法2:广搜

#include <bits/stdc++.h>
using namespace std;
#define N 25
struct Node
{int x, y;Node(){}Node(int a, int b):x(a),y(b){}
};
char mp[N][N];//地图
int w, h;//w:列数 h:行数
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//方向数组
bool vis[N][N];
int bfs(int sx, int sy)//传入起始位置
{queue<Node> que;vis[sx][sy] = true;que.push(Node(sx, sy));int ct = 1;//计数,看可以到达几个黑色格子while(que.empty() == false){Node u = que.front();que.pop();for(int i = 0; i < 4; ++i){int x = u.x + dir[i][0], y = u.y + dir[i][1];if(x >= 1 && x <= h && y >= 1 && y <= w && vis[x][y] == false && mp[x][y] != '#'){vis[x][y] = true;que.push(Node(x, y));ct++;}}}return ct;
}
int main()
{int stx, sty;while(true){cin >> w >> h;if(w == 0 && h == 0)return 0;for(int i = 1; i <= h; ++i)for(int j = 1; j <= w; ++j){cin >> mp[i][j];if(mp[i][j] == '@')stx = i, sty = j;}memset(vis, 0, sizeof(vis));cout << bfs(stx, sty) << endl;}return 0;
}

信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818相关推荐

  1. 信息学奥赛一本通 1209:分数求和 | OpenJudge NOI 1.13 12:分数求和

    [题目链接] ybt 1209:分数求和 OpenJudge NOI 1.13 12:分数求和 [题目考点] 1. 求最大公约数 2. 求最小公倍数 [解题思路] 求最大公约数,可以用辗转相除法.具体 ...

  2. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871

    [题目链接] ybt 1294:Charm Bracelet OpenJudge NOI 2.6 7113:Charm Bracelet 洛谷 P2871 [USACO07DEC]Charm Brac ...

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

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

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

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

  5. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  6. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  7. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  8. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

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

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

最新文章

  1. 完整复现何恺明ICCV获奖论文结果并开源 !(附论文开源代码)
  2. B-监狱逃脱(BFS)
  3. 2021未来科学大奖揭晓:SARS病原发现者、上海交大张杰教授等4人获得百万奖金...
  4. linux命令find
  5. Java多线程详解[狂神说Java]
  6. django_rest_framework之GenericAPIView(三)
  7. linux开启ping服务,Linux 云服务器禁止和开启Ping
  8. 计蒜客——双重回文数
  9. Spring总结七:AOP动态代理的实现
  10. 介绍一些有趣的MySQL pager命令
  11. mapgis新手教程(非常适合新手参考)
  12. 创维hc2800 产品规格书
  13. Genotype陨石的秘密
  14. 各大PT网站信息记录(不断更新中)
  15. Python3 猴子第一天摘下若干个桃子,当即吃了一半..
  16. MATLAB中的eig函数
  17. R pdf大小_免费的pdf压缩大法
  18. Labview | VDM与VAS2018下载
  19. IAR中eww、ewp、ewd···等各文件的含义和用途
  20. 重点人口动态管控轨迹分析系统开发,可视化大数据平台建设

热门文章

  1. 基于visual Studio2013解决面试题之0410计算二进制中1的个数
  2. 【android】读取/res/raw目录下的文件
  3. 一步一步学Remoting之二:激活模式
  4. 这是300年后的人类生活!你相信吗?
  5. 又学到了一个拒绝加班的技巧
  6. “元宇宙”是如何搞垮公司的?
  7. 升级Win11正式版啦!这优化神了,界面不输苹果,速度飞快让人秒弃Win10!
  8. 华为鸿蒙OS 2.0 发布,18点18分开放源代码
  9. 华为反击!要求美国运营商巨头支付 10 亿美元专利费!
  10. 阿里立秋:AI千人千面,淘宝如何做智能化UI测试?