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 ...
随机推荐
- java 中使用Base64
byte[] cipherData = Base64.encodeBase64(plainText.getBytes()); //默认不换行 byte[] cipherData = Base64.en ...
- Elasticsearch query和filter的区别
1.关于Query context和filter context 查询语句的表现行为取决于使用了查询上下文方式还是过滤上下文方式. Query context:查询上下文,回答了“文档是如何被查询语句 ...
- 【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人
题解:hzw大神的博客说的很清楚嘛 http://hzwer.com/1941.html 朴素的做法就是每个点如果它不是墓地那么就可形成十字架的数量就是这个c(点左边的树的数量,k)*c(点右边的树的 ...
- BZOJ1568:[JSOI2008]Blue Mary开公司——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1568 李超线段树(不会的话去网上搜吧……). 完. #include<map> #in ...
- ZOJ1937:Addition Chains——题解
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1937 题目大意:创造一个数列,使得它: 1.单调不递减. 2.其中一个元素 ...
- HDOJ(HDU).1045 Fire Net (DFS)
HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...
- HDOJ(HDU).1258 Sum It Up (DFS)
HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...
- Unresolved import *** (models) error on Eclipse
Eclipse version: Oxygen.2 Release (4.7.2) Python version: 3.6 问题:系统提示:from django.db import models 语 ...
- HTTP的特点?
(1)HTTP是无连接: 无连接的含义是限制每次连接只处理一个请求.服务器处理完客户的请求,并收到客户的应答后,即断开连接.采用这种方式可以节省传输时间. (2)HTTP是媒体独立的: 这意味着,只要 ...
- sql service (case when then else end ..... group by)
1. 原表: courseid coursename score ------------------------------------- 1 java 70 2 oracle 90 3 xml 4 ...