油田合并
TimeLimit: 1 Second MemoryLimit: 32 Megabyte
Totalsubmit: 597 Accepted: 164
Description
某石油公司发现了一个油田。该油田由n*m个单元组成的矩形,有些单元里有石油,有些则没有。单元油田可以通过上,下,左或右连通。在一个单元油田里架设一台采油机,它可以把和该单元油田相连的单元油田的石油采完。该公司想知道最少需要架设几台采油机能把所有的石油采完?
Input
先输入2个正整数n,m(1<=n,m<=50)。接着有n行,每行有m个字符。’@’表示该单元有石油,’*’则表示该单元没有石油。
输入到文件结束。
Output
对于每组测试,输出最少需要架设几台采油机。
Sample Input
2 2
@*
*@
2 2
@@
@@
Sample Output
2
1
#include <cstdio>
#include <cstring>
#define lim 55
char Map[lim][lim];
int Vis[lim][lim];
char str[lim];
void dfs(char Map[][lim], int Vis[][lim], int x, int y);
int main()
{
int row, col;
int cnt=0;
while(scanf("%d%d", &row, &col)!=EOF)
{
cnt=0;
memset(Map, '*', sizeof(Map));
memset(Vis, 0, sizeof(Vis));
memset(str, 0, sizeof(str));
for(int i=1; i<=row; i++)
{
scanf("%s", str);
for(int j=1; j<=col; j++)
Map[i][j]=str[j-1];
}
for(int i=1; i<=row; i++)
{
for(int j=1; j<=col; j++)
{
if(Map[i][j]=='@'&&Vis[i][j]==0)
{
dfs(Map, Vis, j, i);
cnt++;
}
}
}
printf("%d\n",cnt);
}
return 0;
}
void dfs(char Map[][lim], int Vis[][lim], int x, int y)
{
if(Map[y][x]=='*'||Vis[y][x]==1)
return;
Vis[y][x]=1;
dfs(Map, Vis, x-1, y);
dfs(Map, Vis, x+1, y);
dfs(Map, Vis, x, y-1);
dfs(Map, Vis, x, y+1);
}
比八连块更简单的dfs,完全就是一样,拿来练练手,不过要注意Map数组的初始化。我一开始就没有注意到,按照八连块的写法然后出错,找了好久的原因,我竟然把Map数组初始化为0,应该初始化为‘*’。总之虽然很简单,但是要是一次敲对还是有难度的,拿来练练手。