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 ...
随机推荐
- BZOJ 1050 旅行(并查集)
很好的一道题.. 首先把边权排序.然后枚举最小的边,再依次添加不小于该边的边,直到s和t联通.用并查集维护即可. # include <cstdio> # include <cstr ...
- 前台界面(1)---HTML基本定义及常见标签
已经很久没有更新博客了,从今天开始要继续走在学习的路上,话不多说,先来干货: 目录 1. HTML定义 2. H标签 3. Img标签 4. P标签 5. A标签 6. 无序列表 7. 有序列表 8. ...
- NetScaler Best Practice With VMAC In A High Availability Configuration
NetScaler Best Practice With VMAC In A High Availability Configuration https://www.citrix.com/blogs/ ...
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16742 Accepted: 7390 Ca ...
- 【刷题】BZOJ 5154 [Tjoi2014]匹配
Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...
- 【Codeforces Round #406 (Div. 2)】题解
The Monster 签到题,算一下b+=a和d+=c,然后卡一下次数就可以了. Not Afraid 只要一组出现一对相反数就是安全的. Berzerk 题意:[1,n],两个人轮流走,谁能走到1 ...
- python安装方法- 3.6.3版本
一. 官网下载安装包: 官网网址:https://www.python.org/ 我下载的是3.6.3版本,如下图: 二. 安装安装包, 1. 直接双击运行 2. 选择Customize inst ...
- CentOS 7 环境搭建kafka集群
Kafka是一个MQ服务,流行的MQ服务器有三个,分别是ActiveMQ,RabbbitMQ和Kafka 目录说明:/home/fuqinqin/packages : 安装包存放目录/home/fuq ...
- 【CSU1911】Card Game(FWT)
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...
- CodeForces - 158B.Taxi (贪心)
CodeForces - 158B.Taxi (贪心) 题意分析 首先对1234的个数分别统计,4人组的直接加上即可.然后让1和3成对处理,只有2种情况,第一种是1多,就让剩下的1和2组队处理,另外一 ...