复习了dfs的相关内容,完成了一道dfs相关的题目。
P2371挑战算周长
#include <stdio.h>
// 定义一个二维字符数组 map 用于存储地图信息,大小为 25x25
char map[25][25];
// 定义一个常量二维数组 d 作为方向增量数组,用于表示 8 个不同的方向
// 前 4 个方向是上下左右,后 4 个方向是斜向
const int d[8][2]={{0,1},{1,0},{0,-1},{-1,0},{-1,-1},{-1,1},{1,-1},{1,1}};
// 定义变量 ans 用于存储最终计算得到的周长
int ans;
// 定义变量 n 和 m 分别表示地图的行数和列数
// 变量 x 和 y 表示起始点的坐标
int n,m,x,y;// 深度优先搜索函数,参数 x 和 y 表示当前搜索的点的坐标
void dfs(int x,int y){// 如果当前点超出地图边界(x 小于 1 或大于 n,y 小于 1 或大于 m)// 或者当前点是 '.'(表示空地)if(x<1||x>n||y<1||y>m||map[x][y]=='.'){// 说明该点是连通区域的边界,周长加 1ans++;// 结束当前递归调用return;}// 如果当前点已经被标记为 ' '(表示已访问)if(map[x][y]==' '){// 结束当前递归调用return;}// 定义变量 nx 和 ny 用于存储下一个要搜索的点的坐标int nx,ny;// 将当前点标记为 ' ',表示已访问map[x][y]=' ';// 遍历前 4 个方向(上下左右)for(int i=0;i<4;i++){// 计算下一个点的 x 坐标nx=x+d[i][0];// 计算下一个点的 y 坐标ny=y+d[i][1];// 递归调用 dfs 函数,继续搜索下一个点dfs(nx,ny);}// 遍历后 4 个方向(斜向)for(int i=4;i<8;i++){// 计算下一个点的 x 坐标nx=x+d[i][0];// 计算下一个点的 y 坐标ny=y+d[i][1];// 如果下一个点超出地图边界if(nx<1||ny<1||nx>n||ny>m){// 跳过当前方向,继续下一个方向的遍历continue;}// 如果下一个点是 'X'(表示属于连通区域)if(map[nx][ny]=='X'){// 递归调用 dfs 函数,继续搜索下一个点dfs(nx,ny);}}
}// 主函数,程序的入口点
int main(){// 从标准输入读取地图的行数 n 和列数 mscanf("%d%d",&n,&m);// 从标准输入读取起始点的坐标 x 和 yscanf("%d%d",&x,&y);// 循环读取地图的每一行for(int i=1;i<=n;i++){// 从标准输入读取一行字符串,存储到 map[i] 数组中,从索引 1 开始scanf("%s",map[i]+1);}// 调用 dfs 函数,从起始点开始进行深度优先搜索dfs(x,y);// 输出最终计算得到的周长printf("%d\n",ans);return 0;
}