问这个人掉落的海域包含几个岛屿。

八方向相连为同一片海域,四方向相连为同一个岛屿。与边界相连的岛屿不算。

方法:在给定地图外面填充一圈".",从这个人掉落的地方开始进行floodfill,标出他所在的海域。

然后再从(0, 0)点进行一次floodfill,把之前标记的海域之外的东西全部清掉。

最后统计岛屿个数即可。

注意:坐标是反着的

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm> using namespace std; const int MAXN = ; const int dx[] = { -, , , , -, -, , , - };
const int dy[] = { , -, , , -, , , -, - }; struct Point
{
int x, y;
Point( int x = , int y = ): x(x), y(y) { }
}; Point Q[MAXN * MAXN * ];
char G[MAXN][MAXN];
bool vis[MAXN][MAXN];
int R, C, X, Y; bool check( int x, int y, bool wh )
{
if ( wh ) return x > && x <= R && y > && y <= C;
else return x >= && x <= R + && y >= && y <= C + ;
} void FloodFill( Point st, char ch1, char ch2, char ch3, int dir )
{
int front = , rear = ;
bool wh = false;
if ( dir == ) wh = true; Q[rear++] = st; while ( front < rear )
{
Point p = Q[front]; G[ p.x ][ p.y ] = ch3;
vis[ p.x ][ p.y ] = true;
//printf( "%d %d\n", p.x, p.y );
for ( int i = ; i < dir; ++i )
{
int xx = p.x + dx[i];
int yy = p.y + dy[i];
//printf( "vis[%d][%d] = %d\n", xx, yy, vis[xx][yy] );
if ( check( xx, yy, wh ) && !vis[xx][yy] && ( G[xx][yy] == ch1 || G[xx][yy] == ch2 ) )
{
vis[xx][yy] = true;
Q[rear++] = Point( xx, yy );
}
} ++front;
}
return;
} int main()
{
//freopen("s.txt", "w", stdout );
while ( ~scanf( "%d%d%d%d", &C, &R, &Y, &X ) )
{
memset( G, '.', sizeof(G) );
G[][ C + ] = '\0';
for ( int i = ; i <= R; ++i )
{
scanf( "%s", &G[i][] );
G[i][ C + ] = '\0';
} memset( vis, false, sizeof(vis) );
FloodFill( Point( X, Y ), '.', '.', '*', );
memset( vis, false, sizeof(vis) );
FloodFill( Point( , ), '.', '#', ' ', ); memset( vis, false, sizeof(vis) );
int ans = ;
for ( int i = ; i <= R; ++i )
for ( int j = ; j <= C; ++j )
if ( G[i][j] == '#' )
{
++ans;
FloodFill( Point( i, j ), '#', '#', '$', );
}
printf( "%d\n", ans );
}
return ;
}

URAL 1250 Sea Burial 简单Floodfill的更多相关文章

  1. Ural 1250 Sea Burial 题解

    目录 Ural 1250 Sea Burial 题解 题意 输入 题解 程序 Ural 1250 Sea Burial 题解 题意 给定一个\(n\times m\)的地图,\(.\)为水,\(\#\ ...

  2. ural 1250. Sea Burial

    1250. Sea Burial Time limit: 1.0 secondMemory limit: 64 MB There is Archipelago in the middle of a s ...

  3. sea.js简单使用教程

    sea.js简单使用教程 下载sea.js, 并引入 官网: http://seajs.org/ github : https://github.com/seajs/seajs 将sea.js导入项目 ...

  4. ural 1250

    有点坑的dfs  看懂题应该就会做了 神圣海必然围成一个圈  dfs将神圣还外围的全部去掉   简单题 #include <cstdio> #include <cstring> ...

  5. URAL 1203 Scientific Conference 简单dp 难度:0

    http://acm.timus.ru/problem.aspx?space=1&num=1203 按照结束时间为主,开始时间为辅排序,那么对于任意结束时间t,在此之前结束的任务都已经被处理, ...

  6. URAL - 1091 Tmutarakan Exams (简单容斥原理)

    题意:K个不同数组成的集合,每个数都不超过S且它们的gcd>1.求这样的数的个数 分析:从2开始枚举gcd,但这样会发生重复.譬如,枚举gcd=2的集合个数和gcd=3的集合个数,枚举6的时候就 ...

  7. URAL 1326. Bottle Taps(简单的状压dp)

    题目不太好读懂,就是先给你一个n代表要从n个物品中买东西,然后告诉你这n个东西的单位价格,在给你m个集合的情况.就是每一个结合中有x件物品.他们合起来买的价格是k.这x件物品依次是:p1--px.之后 ...

  8. ural 1009. K-based Numbers(简单dp)

    http://acm.timus.ru/problem.aspx?space=1&num=1009 题意:将一个n位数转化为合法的K进制数,有多少种情况.合法的K进制数即不含前导0,且任意两个 ...

  9. URAL 1513. Lemon Tale(简单的递推)

    写几组数据就会发现规律了啊. .但是我是竖着看的.. .还找了半天啊... 只是要用高精度来写,水题啊.就当熟悉一下java了啊. num[i] = 2*num[i-1]-num[i-2-k]. 15 ...

随机推荐

  1. UVALive - 6571 It Can Be Arranged 最大流

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48415 It Can Be Arranged Time Limit: 3000MS 问题描述 Every y ...

  2. Linux网络编程实例解析

    **************************************************************************************************** ...

  3. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  4. 【BZOJ】【2756】【SCOI2012】奇怪的游戏

    网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...

  5. java如何操作注册表(Preferences类)(在windows的注册表中保存、读取)

    我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据.这对改善软件的人机可用性方面是很有用的.比如:数据库监控.日志工具,JDBMo ...

  6. 2014年03月09日攻击百度贴吧的XSS蠕虫源码

    var n=PageData.user.user_forum_list.info.length; var num=0; var config = { titles: ["\u4f60\u76 ...

  7. MyEclipse提示键配置、提示快捷键、提示背景色、关键字颜色、代码显示、编...

    1.提示键配置 一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选 ...

  8. Node.js NPM国内镜像

    NPM国内镜像 http://npm.hacknodejs.com/ http://registry.npmjs.vitecho.com/ https://registry.npm.taobao.or ...

  9. Excel每隔两行自动求和一次怎么操作?

    今天ytkah得到一份数据,要求进行统计分析,由于是原始数据,还没处理过,数据量有点大,如下图所示(Excel每隔两行自动求和),每天的数字由两项组成,男生的人数.消费值和女生的人数和消费值,数字都在 ...

  10. HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

    题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 ...