油田——UVa 572

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。例如,下面的示例中有两个八连块。

****@
*@@*@
*@**@
@@@*@
@@**@

说的挺不好理解的,其实就是找图中有几个连通分量,这图里右两个。

思路#

这题简单,我直接广度优先了。其实学了Abbott的复仇——UVa 816,这代码可以写的更精简,但是我懒得改了。

#include "iostream"
#include "cstdio"
#include "set"
#include "vector"
#include "string"
#include "queue"
#include "sstream"
#define MAX 100

/*
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0

Sample Output
0
1
2
2
*/

using namespace std;

int m,n;
int deposits[MAX][MAX];


bool safe_assert(int i, int j) {
    return i >= 0 && i < m&& j >= 0 && j < n&& deposits[i][j] == 1;
}
void bfs(int i, int j) {
    queue<pair<int, int>> queue;
    queue.push(make_pair(i, j));
    while (!queue.empty()) {
        pair<int, int> kv = queue.front(); queue.pop();
        i = kv.first; j = kv.second;
        deposits[i][j]++;
        if (safe_assert(i - 1, j-1)) 
            queue.push(make_pair(i - 1, j-1));
        if (safe_assert(i - 1, j)) 
            queue.push(make_pair(i - 1, j));
        if (safe_assert(i - 1, j + 1))
            queue.push(make_pair(i - 1, j + 1));
        if (safe_assert(i, j - 1)) 
            queue.push(make_pair(i, j - 1));
        if (safe_assert(i, j + 1))
            queue.push(make_pair(i, j + 1));
        if (safe_assert(i + 1, j - 1))
            queue.push(make_pair(i + 1, j - 1));
        if (safe_assert(i + 1, j))
            queue.push(make_pair(i + 1, j));
        if (safe_assert(i + 1, j+1))
            queue.push(make_pair(i + 1, j+1));
    }
}
int search() {
    int group = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (deposits[i][j]==1) {
                bfs(i, j);
                group++;
            }
        }
    }
    return group;
}

int main() {
    while (scanf("%d %d", &m,&n) != EOF) {
        if (m == 0 && n == 0)break;
        getchar();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                char c;
                scanf("%c", &c);
                deposits[i][j] = c == '@' ? 1 : 0;
            }
            getchar();
        }
		printf("%d\n", search());
    }
    return 0;
}
posted @   yudoge  阅读(127)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩