ACM-数细胞
思路:题目要使用BFS,我直接用DFS也可以A,数细胞就是数矩阵相连个数,直接每次DFS后计数即可。
// 数细胞.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" /*由1连接成多少个整块*/ #include <iostream> #include <cstring> const int MAX = 1005; using namespace std; int n, m, ans, map[MAX][MAX], vis[MAX][MAX];//地图 int dis[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1};//标记数组,方向数组 void DFS(int x, int y)//横纵坐标,在递归中将走过的点标记为1 { for (int i = 0; i < 4; i++) { int tx = x + dis[i][0];//根据方向数组改变方向 int ty = y + dis[i][1]; if (tx >= 0 && tx<n && ty >= 0 && ty<m && map[tx][ty] && !vis[tx][ty])//在地图中且是1,并且没走过,走过的地方不能回头 { vis[tx][ty] = 1;//标记为走过 DFS(tx, ty); } } } int main() { while (cin >> n >> m)//行列 { //init memset(map, 0, sizeof(map)); memset(vis, 0, sizeof(vis)); ans = 0; //read for (int i = 0; i<n; i++) for (int j = 0; j < m; j++) { int t; cin >> t; if (t >= 1 && t <= 9) map[i][j] = 1; else map[i][j] = 0; } //找起点,即找到开始递归的坐标 for (int i = 0; i<n; i++) { for (int j = 0; j<m; j++) { if (map[i][j] && !vis[i][j]) { vis[i][j] = 1; DFS(i, j);//当递归全部结束后,说明已经不能再找到W与这部分相连 ans ++; } } } cout << ans; } return 0; }