hdu1728 逃离迷宫(bfs)

    技术2025-01-20  4

    这是本人写过的最纠结的一次bfs,一看到题目就觉得比较简单,是非常基础的广搜,但是用stl写出来交上去居然WA,修改细节后一直wa,T_T,写代码能力亟须加强,有算法无代码实在是太悲剧了。。。。而且有很多细节需要注意,参考网上程序得出AC代码如下:

    #include<iostream>

    #include<queue>

    using namespace std;

    struct Node

    {

           int x, y;  

           int turn; 

           int dir;    

    };

    char map[110][110];

    int Go[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    int n, m;

    Node start, end;

    int visited[110][110];

    int check(int a,int b)    

    {    

        if(a>=1&&a<=m&&b>=1&&b<=n)    

            return 1;    

        return 0;    

    int check1, limit; 

    queue<Node> Que;  

    void Bfs()

    {

        Node pre, next;

        visited[start.x][start.y]=0;

        Que.push(start);

        while (!Que.empty()){

              pre = Que.front();

              if (pre.x == end.x && pre.y == end.y){

                 if (pre.turn <= limit){

                    check1 = 1;return ;          

                 }          

     

              }   

              Que.pop();  

              for (int i = 0; i < 4; i ++){ 

                  next.x = pre.x + Go[i][0];

                  next.y = pre.y + Go[i][1];

     

                  if (check(next.x, next.y) && map[next.x][next.y] != '*'){ 

                     next.turn = pre.turn;

                     if (pre.dir != i){

                        next.turn ++;

                        if (next.turn > limit){

                           goto l;//不能用continue,暂时我还没想通

                        }

                     }

                        next.dir = i;

                     if (next.turn <= visited[next.x][next.y]){

                        visited[next.x][next.y] = next.turn;

                        Que.push(next);

                     }

                  }  l:;  

              }       

        }

        return ;

    }

    int main()

    {

        int t;

        scanf("%d", &t);

        //cin >> t;

        while (t--){

              scanf("%d %d", &m, &n);

              //cin >> m >>n;

              while (!Que.empty()){Que.pop();}

              for (int i = 1; i <= m; i ++){

                  getchar(); 

                  for (int j = 1; j <= n; j ++){

                      scanf("%c", &map[i][j]); 

                      visited[i][j]=11;   

                      //cin >> map[i][j];

                  }

     

              } 

              scanf("%d %d %d %d %d", &limit, &start.y, &start.x, &end.y, &end.x);

              //cin >> limit >> start.y >> start.x >> end.y >> end.x ;

              check1 = 0;

              start.turn = start.dir = -1;

              Bfs();

              if (check1)printf("yes/n");

              else printf("no/n");     

        }

        return 0;

    }

    另外附上本人脑残的WA代码:

    #include<iostream>

    #include<queue>

    using namespace std;

    struct Node

    {

           int x, y;  

           int turn; 

           int dir;    

    };

    char map[110][110];

    int Go[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    int n, m;

    int sx, sy, ex, ey;

    int visited[110][110];

    int check(int a,int b)    

    {    

        if(a>=1&&a<=m&&b>=1&&b<=n&&!visited[a][b])    

            return 1;    

        return 0;    

    int check1, limit;   

    void Bfs()

    {

        queue<Node> Que;

        memset(visited, 0, sizeof(visited));

        Node temp, pre, next;

        temp.x = sx;

        temp.y = sy;

        temp.turn = -1;

        temp.dir = -1;

        Que.push(temp);

        while (!Que.empty()){

              pre = Que.front();

              for (int i = 0; i < 4; i ++){ 

                  //pre.dir = i;

                  next.x = pre.x + Go[i][0];

                  next.y = pre.y + Go[i][1];

                  next.turn = pre.turn;

                  if (check(next.x, next.y) && map[next.x][next.y] != '*'){ 

                     if (next.dir != i){next.turn ++;}

                     if (next.turn > limit)goto l;

                     if (next.x == ex && next.y == ey){

                        if (next.turn <= limit){

                           //cout << next.turn<<endl;

                           check1 = 1;          

                        }          

                        return ;            

                     }   

                     next.dir=i;

                     visited[next.x][next.y] = 1;

                     Que.push(next);

                  }

                  l:;  

              }

              Que.pop();           

        }

    }

    int main()

    {

        int t;

        //scanf("%d", &t);

        cin >> t;

        while (t--){

              //scanf("%d %d", &m, &n);

              cin >> m >>n;

              for (int i = 1; i <= n; i ++){

                  for (int j = 1; j <= m; j ++){

                      //scanf("%c", &map[i][j]);    

                      cin >> map[i][j];

                  }

                  //getchar();    

              } 

              //scanf("%d %d %d %d %d", &limit, &sy, &sx, &ey, &ex);

              cin >> limit >> sy >> sx >> ey >> ex ;

              check1 = 0;

              Bfs();

              if (check1)printf("yes/n");

              else printf("no/n");     

        }

        return 0;

    }

    最新回复(0)