#include #include
#define size 20
//先模拟_为1,#为0,生成数组如下:
int map[size][size]={0};//用于bfs的数组
int input[size][size]={0};//用于文件读入的数组//int map[size][size]={{1,1,1,1,0,1},{1,1,1,1,1,0},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{0,1,1,1,1,0},{1,0,1,1,0,1}};
typedef structnode{intx;inty;intstep;
}node;
node queue[100000];int head,tail;//队列头和队列尾
int x[4]={-1,0,+1,0};//x坐标的变化
int y[4]={0,+1,0,-1};//y坐标的变化
int num=0;int W=0,H=0;
node sourcepoint={7,1,2};//源点
inthandle;/*函数名:enqueue
* 功能:入队
* 入口参数:要入队的节点
* 返回值:暂无*/
void enqueue(node E){//用tail(对尾)进行插入操作
queue[tail++] = E;//先入队,然后tail加一
}/*函数名:dequeue
* 功能:出队
* 入口参数:要出队的节点
* 返回值:出队的元素*/node dequeue(){//用head(队头)进行删除操作
return queue[head++];//先出队,然后head加一
}/*函数名:bfs
* 功能:广度优先搜索
* 入口参数:1.源点坐标
2.
* 返回值:*/
void bfs(node sourcepoint,int W,intH){
map[sourcepoint.x][sourcepoint.y]=2;//把传染源置为2
enqueue(sourcepoint);//源点入队
node CurPoint ={};//当前点
node NewPoint ={};//新的点
while(head
CurPoint= dequeue();//当前点出队列
for(int i=0;i<4;i++){
NewPoint.x= CurPoint.x +x[i];
NewPoint.y= CurPoint.y +y[i];
NewPoint.step= CurPoint.step+1;if((NewPoint.x=0)&&(NewPoint.y>=0)&&(map[NewPoint.x][NewPoint.y]==1))//模拟_为1,#为0
{
map[NewPoint.x][NewPoint.y]=NewPoint.step;
enqueue(NewPoint);
}
}
}
}voidinit_map(){for(int i=0;i
{for(int j=0;j
{if(input[i][j]==46)
{
map[i][j]= 1;
}else if(input[i][j]==35)
{
map[i][j]= 0;
}else if(input[i][j]==64)
{
sourcepoint.x=i;
sourcepoint.y=j;
map[i][j]=1;
}
}
}
}intmain(){bool ret=true;//截止条件//freopen("input.txt","r",stdin);
while(ret){
scanf("%d",&W);
scanf("%d",&H);if(W==0&&H==0) {ret = false; return 0;}
scanf("%c",&handle);for(int i=0;i
scanf("%c",&input[i][j]);
}
scanf("%c",&handle);//每一行的垃圾
}
init_map();
bfs(sourcepoint,W,H);
num= 0;for(int i=0;i
{if(map[i][j]>1) {
num++;
}//printf("%d ",map[i][j]);
}//printf("\n");
}
printf("%d\n",num);
}
}