hdu1312------------BFS(自己写队列)
因为这是我第一道BFS模板题,想深刻理解,所以不想用STL。就自己写了一个队列,说实话,调用STL真方便啊!等我对算法熟练掌握后,也要用!!
算法是固定的:DFS。 因为加了队列代码有点长啊!但总体还是比较清晰的。
AC代码:
#include<stdio.h>
#include<string.h>
char ch[22][22];
int r,c;
int fan[4][2]={{-1,0},{0,-1},{0,1},{1,0}};
struct queue //自己搞一个队列玩儿
{
int x[100000]; //记录x ,和y坐标
int y[100000];
int front; //队头
int back; //队尾
}qu;
void initqueue(queue &qu) //队列的初始化 ,也相当于队列清零
{
qu.front=0; //这点很重要,要深刻理解啊! 算了,死记住吧
qu.back=-1;
}
void push(queue &qu,int x,int y) //入队列
{
qu.back++;
qu.x[qu.back]=x;
qu.y[qu.back]=y;
}
void pop(queue &qu) //出队列
{
qu.front++;
}
int getx(queue &qu) //取队头的 x 坐标
{
int x;
x=qu.x[qu.front];
return x;
}
int gety(queue &qu) //取队头的 y 坐标
{
int y;
y=qu.y[qu.front];
return y;
}
//不想单独写判空函数了, 如果 front >back, 说明此时队列已经为空
int bfs(int bx,int by,int sum)
{
int i;
int x,y;
int xx,yy;
initqueue(qu); //首先队列清空
push(qu,bx,by); //将起点入队列
while(qu.front<=qu.back) //如果队列不为空
{
x=getx(qu);
y=gety(qu);
pop(qu);
for(i=0;i<4;i++)
{
xx=x+fan[i][1];
yy=y+fan[i][0];
if(xx>=0&&xx<c&&yy>=0&&yy<r&&ch[xx][yy]!='#')
{
sum++;
ch[xx][yy]='#';
push(qu,xx,yy);
}
}
}
return sum;
}
int main()
{
int i,j,bx,by,sum;
while(scanf("%d%d",&c,&r)!=EOF&&c!=0&&r!=0)
{
getchar();
memset(ch,0,sizeof(ch));
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
scanf("%c",&ch[j][i]);
if(ch[j][i]=='@')
{
bx=j;
by=i;
ch[j][i]='#';
}
}
getchar();
}
sum=1;
printf("%d\n",bfs(bx,by,sum));
}
return 0;
}