hdu 1072

#include <iostream>
using namespace std;

int map[10][10];
int _time[10][10];
int step[10][10];
int T,N,M;
int mins;

int sx,sy;
int dirx[4] = {-1,0,1,0};
int diry[4] = {0,1,0,-1};
bool flag;

void DFS(int x,int y)
{
     if(_time[x][y] <= 0)
         return;
     if(map[x][y] == 3)
     {
          if(mins > step[x][y])
          {
                  mins = step[x][y];
          }
          flag = true;
          return;
     }
     for(int i = 0; i < 4; i++)
     {
          int xx = x + dirx[i];
          int yy = y + diry[i];
          if(xx < 0 || xx > N-1 || yy < 0 || y > M-1)
                continue;
          if(map[xx][yy] == 0 || 
              step[xx][yy] <= step[x][y] + 1 && _time[xx][yy] >= _time[x][y] -1 )
              continue;
          step[xx][yy] = step[x][y] + 1;
          _time[xx][yy] = _time[x][y] - 1;
          if(map[xx][yy] == 4 && _time[xx][yy] > 0)
          {
              _time[xx][yy] = 6;
          }
          DFS(xx,yy);
     }
}

int main()
{
    cin>>T;
    while(T--)
    {
         cin>>N>>M;
         for(int i = 0; i < N; i++)
         {
             for(int j = 0; j < M; j++)
             {
                   cin>>map[i][j];
                   if(map[i][j] == 2)
                   {
                         sx = i;
                         sy = j;
                         step[i][j] = 0x3fffffff;
                   }          
             }
         }
         memset(_time,0,sizeof(_time));
        
         flag = false;
         _time[sx][sy] = 6;
         step[sx][sy] = 0;
         mins = 0x3fffffff;
         DFS(sx,sy);
         if(flag)
         {
                 cout<<mins<<endl;
         }
         else
                 cout<<"-1"<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值