1 条题解

  • 0
    @ 2025-5-10 21:38:41

    题意分析

    题目描述了一个由瓦片组成的矩形房间,瓦片有两种颜色:

    '.' 表示黑色瓦片(可以站立和移动)

    '#' 表示红色瓦片(不能站立)

    '@' 表示起点(也是一个黑色瓦片)

    给定起点位置,计算从该点出发,通过上下左右移动(不能移动到红色瓦片),最多可以到达多少个黑色瓦片(包括起点)。

    输入说明:

    多组数据,每组数据包含:

    两个整数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
    上传者