hdu 1026 Ignatius and the Princess I

经典的bfs


#include<stdio.h>
#include<string.h>
int n,m;
int prison[200][200];
char map[200][200];
int visited[200][200];
struct point{
  int x,y,t;
  point* pre;
}queue[20000];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
bool check(int x,int y)
{
   if(x>=0&&x<n&&y>=0&&y<m&&visited[x][y]==0&&map[x][y]!='X')
   {
    return true;
   }
   return false;
}
void output(point p)
{
  if(p.pre==NULL)
   return;
  else
   {
    output(*p.pre);
    if(p.pre->x==p.x&&p.pre->y==p.y)
    printf("%ds:FIGHT AT (%d,%d)\n",p.t,p.x,p.y);
    else
    printf("%ds:(%d,%d)->(%d,%d)\n",p.t,p.pre->x,p.pre->y,p.x,p.y);
   } 
}
void bfs()
{
   int front =0,rear=1;
   queue[front].t=0;
   queue[front].x=0;
   queue[front].y=0;
   queue[front].pre=NULL;
   while(front<rear)
   {
     if(prison[queue[front].x][queue[front].y]>0)
     {
       prison[queue[front].x][queue[front].y]--;
       queue[rear].x=queue[front].x;
       queue[rear].y=queue[front].y;
       queue[rear].t=queue[front].t+1;
       queue[rear].pre=&queue[front];
       front++;
       rear++;
       continue;
     }
     for(int i=0;i<4;i++)
     {
       int xx=queue[front].x+dx[i];
       int yy=queue[front].y+dy[i];
       if(check(xx,yy))
       {
         visited[xx][yy]=-2;
         queue[rear].x=xx;
         queue[rear].y=yy;
         queue[rear].t=queue[front].t+1;
         queue[rear].pre=&queue[front];
         if(xx==n-1&&yy==m-1)
         {
           front=rear;
           while(prison[xx][yy]>0)
           {
             rear++;
             queue[rear].x=queue[front].x;
             queue[rear].y=queue[front].y;
             queue[rear].t=queue[front].t+1;
             queue[rear].pre=&queue[front];
             prison[xx][yy]--;
             front=rear;
           }
           if(prison[xx][yy]==0)
           {
             printf("It takes %d seconds to reach the target position, let me show you the way.\n",queue[front].t);
             output(queue[rear]);
             printf("FINISH\n");
             return;
           }
         }
         rear++;
       }
      }
      front++;
     }
     printf("God please help our poor hero.\n");
     printf("FINISH\n");
}            
int main()
{
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    for(int i=0;i<n;i++)
    {
      scanf("%*c");
      for(int j=0;j<m;j++)
      {
        scanf("%c",&map[i][j]);
        if(map[i][j]=='.')
          prison[i][j]=0;
        else if(map[i][j]=='X')
          prison[i][j]=-1;
        else
          prison[i][j]=map[i][j]-'0';
      }
    }
      memset(visited,0,sizeof(visited));
      bfs();
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值