hdu1072 Nightmare

来源:互联网 发布:无线测试软件 编辑:程序博客网 时间:2024/05/09 10:17

下午写了三道广搜,大同小异,一道涉及位压缩,表示不懂所以WA了,唉,三个都没能秒过,细微的错误太多T_T。。。悲剧,还是算法实现和写代码能力太差,失败!!以后要再加强锻炼了,昨天和Y大牛聊天到很晚,对他的言辞深有感触,特此谢谢Y大牛的教诲^_^。附此题AC代码如下:

# include<iostream>
# include<queue>
using namespace std;
struct Node
{
       int x, y;
       int time;
       int rest;    
};
int n, m;
int Go[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
int map[11][11];
int visited[11][11];
int sx, sy, ex, ey;
int check(int x, int y)
{
    if (x >=1 && x <= n && y >= 1 && y <= m && map[x][y])return 1;
    return 0;
}
int check1;
void Bfs()
{
     queue<Node> Que;
     //memset(visited, 0, sizeof(visited));
     visited[sx][sy] = 6;
     Node temp;
     temp.x = sx;
     temp.y = sy;
     temp.rest = 6;
     temp.time = 0;
     Que.push(temp);
     while (!Que.empty()){
           Node pre = Que.front();
           Que.pop();
           if (pre.x == ex && pre.y == ey && pre.rest > 0){
                     //cout <<"rest:"<< pre.rest<<endl;
              check1 = pre.time;
              return ;          
           }
           for (int i = 0; i < 4; i ++){
               Node next;
               next.x = pre.x + Go[i][0];
               next.y = pre.y + Go[i][1];
               next.rest = pre.rest;
               next.time = pre.time;
               if (check(next.x, next.y) && map[next.x][next.y]!= 0){
                  next.rest --;
                  next.time ++;
                  if (next.rest <= 0)continue;
                  if (map[next.x][next.y] == 4){
                     next.rest = 6;            
                  }
                  if (next.rest > 0 && visited[next.x][next.y] < next.rest){
                     visited[next.x][next.y] = next.rest;
                     Que.push(next);                          
                  }
               }
           }
             
     }
     return ;
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--){
          scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i ++){
        for (int j = 1; 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;} 
            visited[i][j] = 0; 
        }
    }
        check1 = -1;
        Bfs();
        printf("%d/n", check1);
    }
    return 0;   
}

 

原创粉丝点击