【题解】入门

题目描述

        不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。

        由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第1块砖上(第1块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。

        注意:瓷砖可以重复走过,但不能重复计数。

输入输出格式

输入格式

        第一行为两个正整数W和H分,别表示小路的宽度W和长度H,W和H都不大于20。

        以下H行为一个H×W的字符矩阵。每一个字符代表一块瓷砖。其中,“.”代表安全的砖,“#”代表不安全的砖,“@”代表第一块砖。

输出格式

        一行,只包括一个数,即你从第一块砖开始所能安全走过的最多的砖块个数(包括第一块砖)。

输入输出样例

输入样例

11 9

.#.........

.#.#######.

.#.#.....#.

.#.#.###.#.

.#.#..@#.#.

.#.#####.#.

.#.......#.

.#########.

...........

输出样例

59

 

题解

        暴搜一遍起点能遍历到的点即可。

#include <iostream>
#include <queue>

using namespace std;

int w,h;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int a[21][21],ans=1;
queue<int> qx,qy;

void bfs()
{
    while(qx.size())
    {
        int x=qx.front(),y=qy.front();
        for(int i=0;i<4;i++)
        {
            if(x+dx[i]>=1&&x+dx[i]<=h&&y+dy[i]>=1&&y+dy[i]<=w)
            {
                if(!a[x+dx[i]][y+dy[i]]) ans++,a[x+dx[i]][y+dy[i]]=1,qx.push(x+dx[i]),qy.push(y+dy[i]);
            }
        }
        qx.pop(),qy.pop();
    }
}

int main()
{
    char temp;
    cin>>w>>h;
    for(int i=1;i<=h;i++)
    {
        for(int j=1;j<=w;j++)
        {
            cin>>temp;
            if(temp=='#') a[i][j]=1;
            else if(temp=='@') a[i][j]=1,qx.push(i),qy.push(j);
        }
    }
    
    bfs();
    cout<<ans;
    
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10625014.html