【Educational Codeforces Round 1D】【DFS 联通块打标记法】Igor In the Museum 联通块内墙的面数

原创 2015年11月19日 11:14:18
D. Igor In the Museum
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Igor is in the museum and he wants to see as many pictures as possible.

Museum can be represented as a rectangular field of n × m cells. Each cell is either empty or impassable. Empty cells are marked with '.', impassable cells are marked with '*'. Every two adjacent cells of different types (one empty and one impassable) are divided by a wall containing one picture.

At the beginning Igor is in some empty cell. At every moment he can move to any empty cell that share a side with the current one.

For several starting positions you should calculate the maximum number of pictures that Igor can see. Igor is able to see the picture only if he is in the cell adjacent to the wall with this picture. Igor have a lot of time, so he will examine every picture he can see.

Input

First line of the input contains three integers n, m and k (3 ≤ n, m ≤ 1000, 1 ≤ k ≤ min(n·m, 100 000)) — the museum dimensions and the number of starting positions to process.

Each of the next n lines contains m symbols '.', '*' — the description of the museum. It is guaranteed that all border cells are impassable, so Igor can't go out from the museum.

Each of the last k lines contains two integers x and y (1 ≤ x ≤ n, 1 ≤ y ≤ m) — the row and the column of one of Igor's starting positions respectively. Rows are numbered from top to bottom, columns — from left to right. It is guaranteed that all starting positions are empty cells.

Output

Print k integers — the maximum number of pictures, that Igor can see if he starts in corresponding position.

Sample test(s)
input
5 6 3
******
*..*.*
******
*....*
******
2 2
2 5
4 3
output
6
4
10
input
4 4 1
****
*..*
*.**
****
3 2
output
8

#include<stdio.h> 
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=1010,M=0,Z=1e9+7,ms63=1061109567;
const int dy[4]={-1,0,0,1};
const int dx[4]={0,-1,1,0};
int casenum,casei;
char a[N][N];
int vis[N][N];
int rec[N*N];
int ans[N][N];
int n,m,q,tim,num;
void dfs(int y,int x)
{
	vis[y][x]=tim;
	for(int i=0;i<4;i++)
	{
		int yy=y+dy[i];
		int xx=x+dx[i];
		if(a[yy][xx]=='*')++num;
		else if(!vis[yy][xx])dfs(yy,xx);
	}
}
int main()
{
	while(~scanf("%d%d%d",&n,&m,&q))
	{
		MS(vis,0);
		tim=0;
		for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)if(a[i][j]=='.')
			{
				if(vis[i][j]==0)
				{
					++tim;
					num=0;
					dfs(i,j);
					rec[tim]=num;
				}
				ans[i][j]=rec[vis[i][j]];
			}
		}
		int y,x;
		while(q--)
		{
			scanf("%d%d",&y,&x);
			printf("%d\n",ans[y][x]);
		}
	}
	return 0;
}
/*
【题意】
给你一个n(1000)*m(1000)的地图,有k(1e5)个询问,地图上的'*'代表墙,'.'代表空地。
一个墙最多有4个面。*与.相邻的就是其一个面。
对于每个询问,给出一个范围内的坐标(y,x),问你,从这个开始向四周走,能撞到多少面墙。

【类型】
简单dfs

【分析】
直接从每个'.'开始dfs,dfs到的'.'都打上同样的标记,表示其为是相同联通块,
相同连通块的答案是相同的。
同时对墙的每一面用bool数组打标记,被第一次搜到的话就用全局变量计数++
这个全局变量用来更新这个联通块的答案。
这样这道题就做完啦。

然后我们发现,
因为每个'.'最多走一次,
所以其实每面墙也只最多计数1次,它最多只会对一个联通块的答案贡献1.

【时间复杂度&&优化】
O(4nm)

*/


版权声明:题解中哪里写错请一定要指出来QwQ 转载还请注明下出处哦,谢谢^_^

Codeforces Gym 101201G Maximum Islands (dfs求联通块+最大独立集)

7958 Maximum Islands You are mapping a faraway planet using a satellite. Your satellite has c...
  • qq_34374664
  • qq_34374664
  • 2017年10月03日 18:39
  • 289

DFS求联通块

题目输入一个m行n列的字符矩阵,只要有两个‘@’相邻就能组成一个联通块,如下面的字符矩阵有2个联通块****@* @@*@*@**@@@@*@@@**@分析将字符矩阵看作一个图,用DFS对图中的字符遍...
  • csdn_blog_lcl
  • csdn_blog_lcl
  • 2017年03月23日 17:22
  • 495

DFS搜索联通块

对一个3*4方格进行深度优先搜索联通块#include #include using namespace std;int m = 3, n = 4, sum = 0; int pic[3][4]; ...
  • sunlanchang
  • sunlanchang
  • 2017年03月09日 21:31
  • 370

HDU5606 tree 无向图 dfs求联通块

tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total...
  • qdbszsj
  • qdbszsj
  • 2016年04月26日 17:28
  • 466

HDU 1213 How Many Tables (dfs求联通块 || 并查集)

这题真打脸,比赛的时候愣是没写出来(因为当天写了蓝桥杯上的历届试题--剪格子,这题数据很水,被搞晕了),现在回过头来看看,很简单,就是单纯找联通块,。 AC代码: #include #include ...
  • ldw201510803006
  • ldw201510803006
  • 2017年03月16日 11:03
  • 202

用DFS求联通块

很简单的一道题,比如下面那张图,统计字符‘@’组成多少个八连块,如果两个字符‘@’所在的格子相邻(横、竖或者对角线方向),就说他们属于同一个八连块,直接用DFS进行搜索。 代码如下: pa...
  • nanjingxilu
  • nanjingxilu
  • 2017年11月15日 11:07
  • 48

图中连通块的个数:并查集

1. 图的连通性问题在地图上有若干城镇(点),已知所有有道路直接相连的城镇对。要解决整幅图的连通性问题。比如,随意给你两个点,让你判断它们是否连通;或者问你整幅图一共有几个连通块,也就是被分成了几个互...
  • jinzhao1993
  • jinzhao1993
  • 2016年06月28日 20:00
  • 4936

二维矩阵联通块的个数

新白书P162 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 5 5 *@**@ *@@*@ ***@* @*@*@ @@**@ #include ...
  • u011575516
  • u011575516
  • 2015年07月05日 21:34
  • 828

Codeforces Round #292 (Div. 1)

A. Drazil and Factorial 题意: F(x)定义为x各个位阶乘的乘积,给定一个数x要求求出F(x)=F(y)的最大的数y, 其中y的各个位不能包含0和1. 思路: 对于x的各个位,...
  • u013654696
  • u013654696
  • 2015年02月22日 13:35
  • 567

POJ 2117 Electricity 计算联通块的个数

点击打开链接 Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3252   Accep...
  • Dinivity123
  • Dinivity123
  • 2013年11月13日 19:25
  • 1209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Educational Codeforces Round 1D】【DFS 联通块打标记法】Igor In the Museum 联通块内墙的面数
举报原因:
原因补充:

(最多只允许输入30个字)