【NOI】1818 红与黑

来源:互联网 发布:天龙八部源码 编辑:程序博客网 时间:2024/05/15 23:54

描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
包括多个数据集合。每个数据集合的第一行是两个整数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;}
0 0
原创粉丝点击