没什么好讲的代码有详解
问 题 描 述
在 一 个 w × h 的 矩 形 广 场 上 , 每 一 块 1 × 1 的 地 面 都 铺 设 了 红 色 或 黑 色 的 瓷 砖 。 小 林 同 学 站 在 某 一 块 黑 色 的 瓷 砖 上 , 他 可 以 从 此 处 出 发 , 移 动 到 上 、 下 、 左 、 右 四 个 相 邻 的 且 是 黑 色 的 瓷 砖 上 。 现 在 , 他 想 知 道 , 通 过 重 复 上 述 移 动 所 能 经 过 的 黑 色 瓷 砖 数 。 输 入 要 求 : 第 1 行 为 h 、 w ( 2 < w 、 h < 50 ) , 之 间 由 一 个 空 格 隔 开 以 下 为 一 个 w 行 h 列 的 二 维 字 符 矩 阵 , 每 个 字 符 为 “ 分 别 表 示 该 位 置 为 黑 色 的 瓷 砖 、 红 色 的 瓷 砖 、 小 林 的 初 始 位 置 输 出 要 求 : 输 出 一 行 一 个 整 数 , 表 示 小 林 从 初 始 位 置 出 发 经 过 的 黑 色 瓷 砖 数 。
输入样例
11 9
. # . . . . . . . . .
. # . # # # # # # # .
. # . # . . . . . # .
. # . # . # # # . # .
. # . # . . @ # . # .
. # . # # # # # . # .
. # . . . . . . . # .
. # # # # # # # # # .
. . . . . . . . . . .
输出样例
59
题目描述
题目描述了一个在矩形广场上的瓷砖遍历问题。广场的大小为 w × h(宽为 w,高为 h),其中每一块 1 × 1 的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从当前位置出发,向上、下、左、右四个方向移动到相邻的黑色瓷砖上。小林同学想知道,通过重复上述移动,他能够经过的所有黑色瓷砖的总数。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,m,s=0;
char a[105][105];
int X[5]={-1,1,0,0},Y[5]={0,0,-1,1};//{-1(向上),1(向下),0,0} {0,0,-1(向左),1(向右)}
void dfs(int x,int y){
//
if(!(a[x-1][y]=='.'&&a[x+1][y]=='.'&&a[x][y-1]&&a[x][y+1]=='.')){
return ;
}
//判断如果周围没有细胞的时候就返回
for(int i=0;i<4;i++)//四个方向
{
//如果x=1,x[i]=-1,所以a[x+X[i]]=a[1-1]=a[0],同理
if(a[x+X[i]][y+Y[i]]=='.')//判断这个是否是细胞
{
a[x+X[i]][y+Y[i]]='#';//标记
s++;//计数
dfs(x+X[i],y+Y[i]);//递归搜索
a[x+X[i]][y+Y[i]]='.';//删除标记
}
}
}
int main(){
int x,y;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
//
if(a[i][j]=='@'){
x=i;
y=j;
}
//获取@的位置
}
}
dfs(x,y);
cout<<s;
return 0;
}