【NOI】1818 红与黑

7 篇文章 0 订阅

描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

-

这次……真的是BFS纯板子题了
总数就是队列长度
注意多组数据
注意变量初始化

#include<cstdio>
#include<cstring>
using namespace std;

int n,m,s,
    X[5]={ 0, 1, 0,-1},
    Y[5]={ 1, 0,-1, 0};
        //右 下 左 上 
bool a[23][23];

int main()
{
    while(true)
    {
        memset(a,0,sizeof(a));
        int x[410],y[410],h,l;
        h=l=1;
        scanf("%d%d",&m,&n);
        //n行m列
        if(m==0) return 0;
        for(int i=1;i<=n;++i)
        {
            char c[2]; gets(c);//吃空格 
            for(int j=1;j<=m;++j)
            {
                scanf("%c",&c[0]);
                switch(c[0])
                {
                    case '#':a[i][j]=1;break;//红的 
                    case '@':x[1]=i;y[1]=j;break;//起点 
                }
            }
        }
        a[x[1]][y[1]]=1;
        do
        {
            for(int i=0;i<4;++i)//循环方向  
            {
                  int xx=x[h]+X[i],
                      yy=y[h]+Y[i];//移动后的坐标 
                  if(!a[xx][yy])
                    if(xx>=1&&xx<=n&&yy>=1&&yy<=m)//在地图里  
                    {
                        ++l;//继续走 
                        x[l]=xx;y[l]=yy;//存坐标 
                        a[xx][yy]=1;
                    }
            }
            ++h;
        }
        while(h<=l);
        printf("%d\n",l);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值