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只好去下棋了---课程作业---图的填色的更多相关文章

  1. floodfill算法解题示例

    Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法.因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Floo ...

  2. unity, water cube

    <纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...

  3. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  4. paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他

    在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...

  5. (转) 坚持完成这套学习手册,你就可以去 Google 面试了

      坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读6138    本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Interv ...

  6. Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了

    作者:Glowin链接:https://zhuanlan.zhihu.com/p/22881223来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:Google ...

  7. 去model化开发

    前言 去model化是一种框架设计上的做法,其中的model并不是指架构中的model层,套用Casa大神博客中的原文就是: model化就是使用数据对象,去model化就是不使用数据对象. 常见的去 ...

  8. 学校oj平台上不去

    学校oj平台上不去,我的作业咋办啊

  9. PP.io的三个阶段,“强中心”——“弱中心”——“去中心”

    什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...

随机推荐

  1. 【转】PowerDesigner中Table视图同时显示Code和Name

    为避免图片失效,文字描述, Tools-Display Preference-->左侧Table-->右下角Advanced-->左侧树Columns-->右侧上面第一个放大镜 ...

  2. 【Codeforces Round #405 ( Div 2)】题解

    Bear and Big Brother 签到题,直接模拟就可以了. Bear and Friendship Condition 满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的. 然 ...

  3. [HNOI2010]合唱队 区间DP

    ---题面--- 题解: 偶然翻到这道题,,,就写了. 观察到一个数被插在哪里只受前一个数的影响,如果明确了前一个数是哪个,那么我们就可以确定大小关系,就可以知道当前这个数插在哪里,而上一个插入的数就 ...

  4. Ubuntu16.04 U盘安装Ubuntu16.04制作 光盘刻录 安装与简介

    从今天开始,我会把我遇到过的技术问题一一记录下来,从而分享给有需要的朋友,尽量希望你们少走弯路! 一.首先从官网上下载Ubuntu16.04镜像,下载最好从官网上下载(http://www.ubunt ...

  5. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  6. New Year and Domino 二维前缀和

    C. New Year and Domino time limit per test 3 seconds memory limit per test 256 megabytes input stand ...

  7. linux和windows多线程的异同

    linux多线程及线程同步和windows的多线程之间的异同 并不是所有的程序都必须采用多线程,有时候采用多线程性能还不如单线程.采用多线程的好处如下: (1)多线程之间采用相同的地址空间,共享大部分 ...

  8. 关于jmf不能播放mp3的问题解决

    想写个JAVA的MP3音乐管理器,使用JMF插件,但发现运行时总报一个异常: Unable to handle format: mpeglayer3, 44100.0 Hz, 16-bit, Ster ...

  9. Fiddler进行模拟POST、PUT提交数据注意点

    1.请求头要加 Accept: application/xml Content-Type: application/json 2.地址栏url地址后不要忘记加“/” 3.POST和PUT的对象参数都是 ...

  10. 51Nod 1003 阶乘后面0的数量 | 思维

    题意:n的阶乘后面0的个数,如果直接算出阶乘再数0的数量一定会超时的. 因为10=2*5,所以求出5贡献的次数就行. #include "bits/stdc++.h" using ...