1 条题解
-
0
算法标签:
dfs
题解:
代码功能概述 此代码主要解决的是在二维字符矩阵里的连通块搜索问题。给定一个由字符 X 和 . 组成的二维矩阵,以及矩阵中的起始坐标 (x, y),程序会从该起始点开始运用深度优先搜索(DFS)算法,计算与起始点相连通的 X 块周围 . 的数量。
解题思路 输入处理:首先读取矩阵的行数 m、列数 n 以及起始坐标 (x, y),接着把矩阵数据存入二维字符数组 a 中。
深度优先搜索:从起始坐标 (x, y) 开始进行深度优先搜索。在搜索过程中,对每个位置的上下左右四个方向进行检查,若遇到 . 则计数加 1。同时,对该位置的 8 个方向进行递归搜索,持续扩展连通块。
标记访问:利用 book 数组标记每个位置是否已被访问,防止重复访问。
输出结果:最终输出与起始点相连通的 X 块周围 . 的总数。
#include<algorithm> #include<iostream> #include<string.h> using namespace std; const int N = 1e2; char a[N][N]; int m,n,x,y; int book[N][N]; int nxt[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; int dfs(int i,int j) { book[i][j] = 1;//每一个元素只访问一次 int sum = 0; for(int k = 0; k < 8; k+=2){//枚举每一个X上下左右四个方向的点点 if(a[i+nxt[k][0]][j+nxt[k][1]]=='.'){ sum++; } } for(int k = 0; k < 8; ++k){//搜索连通块 int tx = nxt[k][0]+i; int ty = nxt[k][1]+j; if(book[tx][ty]==1||a[tx][ty]=='.')//边界条件,点点就是边界 continue; sum = sum + dfs(tx,ty); } return sum; } int main() { while(cin>>m>>n>>x>>y&&m!=0){ memset(book,0,sizeof book); memset(a,'.',sizeof a); for(int i = 1; i <= m; ++i){ for(int j = 1; j <= n; ++j){ cin>>a[i][j]; } } int ans = dfs(x,y); cout<<ans<<endl; } return 0; }
- 1
信息
- ID
- 112
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者