当前位置 博文首页 > u012938183的博客:油田(zoj 1709, poj 1562)

    u012938183的博客:油田(zoj 1709, poj 1562)

    作者:[db:作者] 时间:2021-06-13 12:15

    油田(zoj 1709, poj 1562)

    【题目描述】
    GeoSurvComp 地质探测公司负责探测地下油田。 每次 GeoSurvComp 公
    司都是在一块长方形的土地上来探测油田。 在探测时, 他们把这块土地用
    网格分成若干个小方块, 然后逐个分析每块土地, 用探测设备探测地下是
    否有油田。 方块土地底下有油田则称为 pocket, 如果两个pocket相邻, 则
    认为是同一块油田, 油田可能覆盖多个 pocket。
    你的工作是计算长方形的土地上有多少个不同的油田。
    【输入描述】
    输入文件中包含多个测试数据, 每个测试数据描述了一个网格。
    每个网格数据的第一行为两个整数: m n, 分别表示网格的行和列; 如
    果m = 0, 则表示输入结束, 否则 1≤m≤100, 1 ≤n≤100。
    接下来有m 行数据, 每行数据有 n 个字符(不包括行结束符) 。 每个字
    符代表一个小方块, 如果为"*", 则代表没有石油, 如果为"@", 则代表
    有石油, 是一个 pocket。
    【输出描述】
    对输入文件中的每个网格, 输出网格中不同的油田数目。 如果两块不同
    的 pocket 在水平、 垂直、 或者对角线方向上相邻, 则被认为属于同一块油
    田。 每块油田所包含的 pocket 数目不会超过 100。

    // dfs深搜
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int n, m;
    bool vis[110][110];
    char mp[110][110];
    const int dx[8]={-1,1,0,0,-1,1,-1,1};
    const int dy[8]={0,0,-1,1,-1,1,1,-1};
    void dfs(int x, int y)
    {
    	vis[x][y] = true;
    	for(int i = 0; i < 8; i ++)
    	{
    		int nx = x + dx[i];
    		int ny = y + dy[i];
    		if(nx <= 0 || nx > n || ny <= 0 || ny > m)
    		{
    			continue;
    		}
    		if(vis[nx][ny])
    		{
    			continue;
    		}
    		if(mp[nx][ny] != '@')
    		{
    			continue;
    		}
    		dfs(nx, ny);
    	}
    }
    
    int main()
    {
    	
    	while(scanf("%d%d", &n, &m) == 2){ 
    	    if(m == 0 && n == 0)
    	    {
    	    	break;
    		}
    	memset(vis, false, sizeof vis);
    		for(int i= 1; i <= n; i ++)
    		{
    			scanf("%s", mp[i] + 1);
    		}
    		int cnt = 0;
    		for(int i = 1; i <= n; i ++)
    		{
    			for(int j = 1; j <= m; j ++)
    			{
    				if(! vis[i][j] && mp[i][j] == '@')
    				{
    					dfs(i, j);
    					cnt ++;
    				}
    			}
    		}
    		printf("%d\n", cnt);
    	} 
    	return 0;
    }
    
    下一篇:没有了