瓷砖

题目:在一个w x h的矩形广场上,每一块1 x 1的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻且是黑色的瓷砖上。现在,他想知道,通过重复上述移动能经过的黑色瓷砖数。

数据输入:

第1行为h、w,2<=w、h<=50,之间有一个空格隔开。

以下为1个w行h列的二维字符矩阵,每个字符为“.”“#”“@”,分别表示该位置为黑色的瓷砖、红色的瓷砖、小林的初始位置。

数据输出:

输出一行一个整数,表示小林从初始位置出发可以经过的黑色瓷砖数。

题解:一道"迷宫"题,用深搜,挨个上下左右枚举,如果是黑色瓷砖,dfs。否则不管,在定义一个flag数组,记录走过没有,如果走到一个没被走过的黑色瓷砖,ans++。

#include<cstdio>
#include<iostream>
using namespace std;
char a[60][60];
bool flag[60][60];
int ans=1;
void dfs(int x,int y)//深搜函数
{
    if(a[x+1][y]=='.' && !flag[x+1][y])//判断是否要dfs,下面同理
    {
        flag[x+1][y]=1;
        ans++;//答案++
        dfs(x+1,y);
    }
    if(a[x-1][y]=='.' && !flag[x-1][y])
    {
        flag[x-1][y]=1;
        ans++;
        dfs(x-1,y);
    }
    if(a[x][y+1]=='.' && !flag[x][y+1])
    {
        flag[x][y+1]=1;
        ans++;
        dfs(x,y+1);
    }
    if(a[x][y-1]=='.' && !flag[x][y-1])
    {
        flag[x][y-1]=1;
        ans++;
        dfs(x,y-1);
    }
    return;
}
int main()
{
    int w,h;
    cin>>h>>w;
    int x,y;
   //读入
    for(int i=1;i<=w;i++)
    {
        for(int j=1;j<=h;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='@')
            {
                x=i;
                y=j;
            }
        }
    }
    dfs(x,y);//深搜
    cout<<ans<<endl;//输出
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/chen-1/p/9462933.html
今日推荐