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;
}

posted on 2012-03-12 21:40  hrbust_09zhangyabin  阅读(195)  评论(0编辑  收藏  举报