DFS(连通块) ZOJ 2743 Bubble Shooter

题目传送门

题意:从炮台射出一个球,三个及以上颜色相同的会掉落,问最后会掉落多少个球

分析:先从炮台找一个连通块,然后与顶部连接的连通块都不会掉落,剩下的就是炮台射出后跟随掉落的。

#include <bits/stdc++.h>

const int N = 100 + 5;
char str[N][N];
int H, W, h, w;
int ans;

bool check(int x, int y) {
	if (x < 1 || x > H || y < 1 || y > W || (x%2==0 && y==W) || str[x][y] == ‘@‘) return false;
	return true;
}

void DFS(int x, int y, char color, int &cnt) {
	if (!check (x, y)) {
		return ;
	}
	if (color != ‘@‘ && color != str[x][y]) {
		return ;
	}
	cnt++;
	str[x][y] = ‘@‘;
	DFS (x - 1, y, color, cnt);
	DFS (x + 1, y, color, cnt);
	DFS (x, y - 1, color, cnt);
	DFS (x, y + 1, color, cnt);
	if (x & 1) {
		DFS (x - 1, y - 1, color, cnt);
		DFS (x + 1, y - 1, color, cnt);
	} else {
		DFS (x - 1, y + 1, color, cnt);
		DFS (x + 1, y + 1, color, cnt);
	}
}

int main() {
	while (scanf ("%d%d%d%d", &H, &W, &h, &w) == 4) {
        for (int i=1; i<=H; ++i) {
			scanf ("%s", str[i] + 1);
			for (int j=1; j<=W; ++j) {
				if (str[i][j] == ‘E‘) {
					str[i][j] = ‘@‘;
				}
			}
        }
		int cnt = 0;
		DFS (h, w, str[h][w], cnt);
		int ans = cnt;
		if (ans < 3) {
			puts ("0");
			continue;
		}
		for (int i=1; i<=W; ++i) {
			DFS (1, i, ‘@‘, cnt);
		}
		for (int i=1; i<=H; ++i) {
			for (int j=1; j<=W; ++j) {
				if (i % 2 == 0 && j == W) continue;
				if (str[i][j] != ‘@‘) {
					ans++;
				}
			}
		}
		printf ("%d\n", ans);
	}

	return 0;
}

  

时间: 2024-11-04 07:55:11

DFS(连通块) ZOJ 2743 Bubble Shooter的相关文章

DFS(连通块) HDU 1241 Oil Deposits

题目传送门 1 /* 2 DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-4 10:11:11 7 File Name :HDOJ_1241.cpp 8 ************************************************/ 9 10

POJ 1979 Red and Black(DFS 连通块中元素数量)

题意  求矩阵中包含'@'的'.'连通块中元素数量  '@'也看做'.' 最基础的dfs了 #include<cstdio> #include<cstring> using namespace std; const int N = 30; char mat[N][N]; int dx[4] = {0, 0, -1, 1}, dy[4] = { -1, 1, 0, 0}; int ans; void dfs(int r, int c) { if(mat[r][c] != '.') r

HDU1241 Oil Deposits(dfs+连通块问题)

背景描述 ztw同志负责探测地下石油储藏.ztw现在在一块矩形区域探测石油.他通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石油的小方格相邻(横向相邻,纵向相邻,还有对角相邻),那么它们被认为是同一油藏的一部分.在这块矩形区域,可能有很多油藏.你的任务是确定有多少不同的油藏. 输入 输入可能有多个矩形区域(即可能有多组测试).每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m=0表示输入的结束,接下来是n行,每行m个字符.每个字符对应一个小方格,并且要么

ZOJ 2412 Farm Irrigation(DFS 条件连通块)

题意  两块农田里面的管道可以直接连接的话  他们就可以共用一个水源   有11种农田  上面的管道位置是一定的  给你一个农田矩阵  问至少需要多少水源 DFS的连通块问题  两个相邻农田的管道可以直接连接的话他们就属于一个连通块  题目就是求连通块个数 #include<cstdio> #include<cstring> using namespace std; const int N = 55; char mat[N][N]; int type[11][4] = { //对应

ZOJ 1709 Oil Deposits(dfs,连通块个数)

Oil Deposits Time Limit: 2 Seconds      Memory Limit: 65536 KB The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid th

nyoj27-水池数目 (求连通块数目)【dfs】

http://acm.nyist.net/JudgeOnline/problem.php?pid=27 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0

dfs:连通块

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

uva 11853 Paintball dfs找连通块

题意: 给出一个矩形湖, 湖里面有一些圆形地小岛, 问能否从左岸乘船到达右岸,如果能,找出最上面的起点和终点. 题解: 如果能从左岸到达右岸,那么一定不能存在一个连通的岛屿从上岸连到下岸, 所以直接从上到下做dfs,判断是否存在从上岸到下岸地连通块,完成判断.那么接下来就是如何找出最上方地点了,画画图便发现,对于起点,如果存在跨越上岸和左岸地连通岛屿,那么起点一定只能在左岸地交点下方,所以,只需在dfs的过程中更新起点和终点位置即可. 代码: #include <queue> #include

Oil Deposits DFS FloodFill漫水填充法求连通块问题

Oil Deposits The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It