1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色
1002: 当不成勇者的Water只好去下棋了
Time Limit: 1 Sec Memory Limit: 128 MB
Description
由于魔王BOSS躲起来了,说好要当勇者的Water只好去下棋了,他很厉害,基本每局必输。
Water总是不知道为什么把自己的棋下得东一块西一块,而块与块之间总是被对手的棋隔开。概率统计挂了的Water一直没搞清楚到底自己被别人分成了多少块,又来找你帮忙。
假定Water的棋为X,对手的棋为O。
给出一个矩阵棋盘,上面布满了棋子,求Water的棋子究竟被对手分成了多少块?
(为了和谐,我们还是用0011代表OOXX)
Input
第一行为n, m。 (0 < n,m <= 100)
接下来 n 行 m 列为01矩阵。
1 为Water的棋。
Output
每组数据输出一行,表示块数。
Sample Input
2 2
01
10
2 3
101
011
Sample Output
2
2
这道题利用的原理是图的填色,从一个二维数组第一个元素开始进行遍历,如果发现一个元素a是有效的,那么久在他的周围找同样有效的元素b,如果找到了,那么就在元素b的周围继续寻找。很明显,这可以用递归来实现。当然你也可以用栈来模拟递归实现。
下面来看看伪代码:
/* Floodfill */
bool validNode(newnode) {
cond1 = inMatrix();//是否在图内部
cond2 = isFreeNode();//是否是有效元素(这里指值为1)&&是否已经是某个块的成员
return cond1 && cond2;
} void floodfill(node) {
if node是有效元素 {
if node还不是某块的成员
c[node.x][node.y] = color; //遍历上下左右四个元素
for (direction dir) {
newnode = extend(node, dir);
if (validNode(newnode))
floodfill(newnode);
}
}
} char g[n][m];//储存元素的数组 int color = ;//分块的标志 int c[n][m];//分块记录 init();//初始化 readGraph();//读取分块记录 //遍历全部元素,进行分块
for (i = ...n)
for (j = ...m) {
// c[i][j] == 0 && g[i][j] == '1'
node = freeNode();
color++;
floodfill(node);
}
然后递归的代码实现如下:
#include <iostream>
#include <stdio.h>
#include <set> using namespace std; struct Node{
int x;
int y;
Node(int x_ = , int y_ = ) {
x = x_;
y = y_;
}
}; //上下左右四个节点
int borderUponX[] = {, , , -};
int borderUponY[] = {, -, , };
int n, m;
char g[][];
int color = ;
int c[][]; bool validNode(Node newnode) {
if (newnode.x < || newnode.x > n || newnode.y < || newnode.y > m)
return false;
if (g[newnode.x][newnode.y] != '' || c[newnode.x][newnode.y] != -)
return false;
return true;
} void floodfill(Node node) {
if(g[node.x][node.y] == '') {
if (c[node.x][node.y] == -)
c[node.x][node.y] = color; for (int i = ; i != ; i++) {
int pathX = node.x + borderUponX[i];
int pathY = node.y + borderUponY[i];
Node t = Node(pathX, pathY);
if (validNode(t)) {
floodfill(t);
}
}
}
} void init() {
for (int i = ; i != n; i++) {
scanf("%s", g[i]);
}
for (int i = ; i != n; i++)
for (int j = ; j != m; j++)
c[i][j] = -;
} void readGraph() {
set<int> count;
for (int i = ; i != n; i++) {
for (int j = ;j != m; j++) {
if (c[i][j] != - && g[i][j] != '') {
count.insert(c[i][j]);
}
}
}
printf("%d\n", count.size());
} int main() {
while (scanf("%d%d", &n, &m) != EOF) {
init(); for (int i = ; i != n; i++) {
for (int j = ;j != m; j++) {
color++;
floodfill(Node(i, j));
}
}
readGraph();
} return ;
}
1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色的更多相关文章
- floodfill算法解题示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法.因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Floo ...
- unity, water cube
<纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...
- 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)
最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...
- paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他
在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...
- (转) 坚持完成这套学习手册,你就可以去 Google 面试了
坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读6138 本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Interv ...
- Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了
作者:Glowin链接:https://zhuanlan.zhihu.com/p/22881223来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:Google ...
- 去model化开发
前言 去model化是一种框架设计上的做法,其中的model并不是指架构中的model层,套用Casa大神博客中的原文就是: model化就是使用数据对象,去model化就是不使用数据对象. 常见的去 ...
- 学校oj平台上不去
学校oj平台上不去,我的作业咋办啊
- PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...
随机推荐
- kaptcha验证码在windows下正常,在linux下无法显示
有几种情况,记录备忘: 1.两个环境字体不一样,linux环境下可能没有字体,重新安装字体即可. 2.tomcat等容器下没有temp目录,手动建立即可. 3.如果报找不到类的错误,检查JDK是否正确 ...
- PCA误差
我们知道,PCA是用于对数据做降维的,我们一般用PCA把m维的数据降到k维(k < m). 那么问题来了,k取值多少才合适呢? PCA误差 PCA的原理是,为了将数据从n维降低到k维,需要找到k ...
- UVA.699 The Falling Leaves (二叉树 思维题)
UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...
- 浴谷夏令营例题Codeforces827DBest Edge Weight(三个愿望,一次满足~(大雾
这题在浴谷夏令营wyx在讲的最小生成树的时候提到过,但并没有细讲怎么写... 这题可以用三种写法写,虽然只有两种能过...(倍增/倍增+并查集/树链剖分 先跑出最小生成树,分类讨论,在MST上的边,考 ...
- pandas模块(数据分析)------Series
pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. pandas的主要功能: 具备对其功能的数据结构DataFrame.Series 集成时间序列功能 提供丰 ...
- 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)
阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...
- hdu 5625
Clarke and chemistry Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- [codeforces/edu2]总结(F)
链接:http://codeforces.com/contest/600 A题: 字符串处理. B题: sort+upper_bound C题: 统计一下每种字符的个数,然后贪心. (1) 如果没有奇 ...
- arm-linux-gcc等交叉编译工具的安装
1.软件安装 步骤1:打开虚拟机,在/usr/local/下创建/usr/local/arm文件夹(一般用户自定义程序放到这里) 步骤2:先将安装包从Windows中弄到linux中去.可以用共享文件 ...
- ObservableCollection 类
假设您正在创建 Windows 窗体应用程序,并且已将 DataGridView 控件绑定到标准 List(Of Customer) 数据结构.您希望能够使网格中的项目与基础数据源中的值保持同步.也就 ...