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 ...
随机推荐
- 【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排 状态压缩dp
题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土 ...
- Socket_FTP
1. md5加密回顾: import hashlib m=hashlib.md5() #创建md5对象 m.update(b'abcd') #生成加密串 m.update(b'efg') print( ...
- 【刷题】洛谷 P3809 【模板】后缀排序
题目背景 这是一道模板题. 题目描述 读入一个长度为 \(n\) 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
- LOJ6276:果树——题解
https://loj.ac/problem/6276#submit_code NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求.这颗果树有N 个节点 ...
- 项目管理---git----快速使用git笔记(三)------coding.net注册和新建项目(远程仓库)
我们在第一章已经了解了github和coding.net的区别: github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开. codin ...
- requireJs使用方法项目实例
首先,定义 main.js 和 事件处理的公共 js main.js 主要是定义引用名称和路径的对应关系 事件绑定模块: 写jsp页面: jsp中先引入 require.js 和 main.js 然 ...
- 集成淘宝sdk
204是安全图片的问题, 请先检测以下几点: .请检测百川控制台是否已经申请初级API. .请检测百川控制台“我的产品后台”是否开通电商SDK应用.(重点检测很多用户疏忽这一点) .debug版本的可 ...
- POJ 2763 Housewife Wind 纯粹LCA写法(简单无脑)
Description After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordina ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- bzoj 4831 [Lydsy1704月赛]序列操作 dp
[Lydsy1704月赛]序列操作 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 203 Solved: 69[Submit][Status][Dis ...