1 条题解
-
0
题意分析
题目描述了一个由瓦片组成的矩形房间,瓦片有两种颜色:
'.' 表示黑色瓦片(可以站立和移动)
'#' 表示红色瓦片(不能站立)
'@' 表示起点(也是一个黑色瓦片)
给定起点位置,计算从该点出发,通过上下左右移动(不能移动到红色瓦片),最多可以到达多少个黑色瓦片(包括起点)。
输入说明:
多组数据,每组数据包含:
两个整数W和H(1 ≤ W, H ≤ 20),表示房间的宽度和高度
接下来H行,每行W个字符表示瓦片布局
输入以0 0结束
输出要求:
对于每组数据,输出从起点可以到达的黑色瓦片总数
解题思路
输入处理:
读取W和H,判断是否结束
读取H行瓦片数据,存储到二维数组G中
寻找起点:
遍历二维数组,找到'@'的位置
深度优先搜索(DFS):
从起点开始DFS遍历所有可达的黑色瓦片
使用vis数组记录已访问的瓦片,避免重复计数
四个移动方向:上下左右
计数与输出:
统计访问过的黑色瓦片数量,输出结果
代码实现
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define MAX_N 100000 * 2 + 16 using namespace std; int W,H; bool vis[25][25]; char G[25][25]; int sum; int dx[]={ 1,-1, 0, 0}; int dy[]={ 0, 0,-1, 1}; void dfs(int x,int y) { vis[x][y] = 1; sum++; for(int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if ( G[nx][ny] =='.' && nx>0 && nx<=H && ny>0 && ny<=W && !vis[nx][ny]) dfs(nx,ny); } return ; } int main() { while(scanf("%d%d",&W,&H)) { if (W==0 && H==0) break; sum = 0; memset(G,0,sizeof(G)); memset(vis,false,sizeof(vis)); for(int i = 1; i <= H; i++) { for(int j = 1; j <= W; j++) { cin>>G[i][j]; } } for(int i = 1; i<=H;i++) { for(int j = 1;j<=W;j++) { if ( G[i][j]=='@' ) dfs(i,j); } } cout<<sum<<endl; } }
- 1
信息
- ID
- 980
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者