hdu (1072) Nightmare

来源:互联网 发布:usb转网络接口怎么驱动 编辑:程序博客网 时间:2024/05/16 15:22

很简单的一道题;
对于这道题一出错的地方在于,如何让标记;
因为由于要延长炸弹的时间而使得一些地方重复走;
不标记的话无法结束,但要想步数最少,那么4位置一定只能走一次;
所以对值是4位置进行标记就可以了;


#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int map[100][100];
int visit[100][100];
int dir[4][2]={-1,0,  1,0,  0,1,  0,-1};
int n,m,sx,sy,ex,ey;
struct point
{
 int x,y,z;
 int step;
};
int judge(int x,int y)
{
 if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!=0)
  return 1;
 return 0;
}
int bfs(int x,int y)
{
 int i;
 memset(visit,0,sizeof(visit));
 queue<point>q;
 point cur,next;
 cur.x=x;cur.y=y;cur.z=6;
 cur.step=0;
 visit[x][y]=1;
 q.push(cur);
 while(!q.empty())
 {
  next=q.front();
  q.pop();
  if(next.x==ex&&next.y==ey&&next.z>=1)
   return next.step;
  for(i=0;i<4;i++)
  {
   x=next.x+dir[i][0];
   y=next.y+dir[i][1];
   cur.z=next.z-1;
   if(judge(x,y)&&cur.z>=1&&visit[x][y]==0)
   {
    cur.x=x;
    cur.y=y;
    if(map[x][y]==4)
    {
     cur.z=6;
     visit[x][y]=1;
    }
    cur.step=next.step+1;
    q.push(cur);
   }
  }
 }
 return -1;
}
int main()
{
 int i,j,k;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%d%d",&n,&m);
  for(i=0;i<n;i++)
   for(j=0;j<m;j++)
   {
    scanf("%d",&map[i][j]);
    if(map[i][j]==2)
    {
     sx=i;sy=j;
    }
    if(map[i][j]==3)
    {
     ex=i;ey=j;
    }
   }
   if(bfs(sx,sy))
    printf("%d\n",bfs(sx,sy));
   else
    printf("-1\n");
 }
 return 0;
}

 

原创粉丝点击