测试用例中的推箱子错误

时间:2016-03-25 15:50:48

标签: c++ game-development

构造一个图形,其中顶点是元组(Sx,Sy,Bx,By),用于描述推箱子玩家的当前位置(Sx,Sy)和方框(Bx,By)。记录到达每个位置的已知最低成本,并使用优先级队列执行BFS,以找到到达目标单元格的位置的最短路径。这是生成的代码...... 输入格式

第一行由两个整数r和c(均为≤20)组成,分别代表迷宫的行数和列数

以下是r行,每行包含c个字符。每个角色描述迷宫的一个细胞。充满岩石的细胞用'#'表示,空细胞用'''表示。你的起始位置用'S'表示,盒子的起始位置用'B'表示,目标单元用'T'表示。

输出格式

如果无法将盒子带到目标单元格,请打印-1。

否则,在一行上输出两个整数P和W,其中P是推送次数,W是最佳解决方案中的步数。

     HERE IS THE CODE.... my problem is  when input is:
    7 11
    ###########
    #T##......#
    #.#.#..####
    #....B....#
    #.######..#
    #.....S...#
    ###########
     output appears as -1. whereas it should hav been 6 22 

请告诉我代码中的错误是什么..

 #include <iostream>
    #include <queue>
    #include <string>
    #include <algorithm>
    using namespace std;
    const int MAX = 20 + 5; 
    char map[MAX][MAX]; 
    int visPerson[MAX][MAX];
    int visBox[MAX][MAX]; 
    int R, C;
    int dir[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}};
    char pushes[4] = {'E', 'W', 'S', 'N'}; 
    char walks[4] = {'e', 'w', 's', 'n'}; 
    string path; 
    struct NODE 
    {
     int br, bc; 
     int pr, pc; 
     string ans; 
    };
    int InMap(int r, int c) 
    {
     return (r >= 1 && r <= R && c >= 1 && c <= C);
    }
    int Bfs2(int sr, int sc, int er, int ec, int br, int bc, string &ans)
    {
     queue<NODE> q; 
     NODE node, tmpNode; 
     node.pr = sr; node.pc = sc; node.ans = "";
     q.push(node);
     visPerson[br][bc] = 1; 
     while (!q.empty()) 
     {
     node = q.front();
     q.pop();
     if (node.pr==er && node.pc==ec) { ans = node.ans; return 1; }
     if (visPerson[node.pr][node.pc]) continue;
     visPerson[node.pr][node.pc] = 1;
     for (int i=0; i<4; i++) 
     {
     int nr = node.pr + dir[i][0]; int nc = node.pc + dir[i][1];
     if (InMap(nr, nc) && !visPerson[nr][nc] && map[nr][nc] !='#')
     {
     tmpNode.pr = nr; tmpNode.pc = nc; tmpNode.ans = node.ans+ walks[i];
     q.push(tmpNode);
     }
     }
     }
     return 0;
    }
    int Bfs1(int sr, int sc, int br, int bc) 
    {
     queue<NODE> q; 
     NODE node, tmpNode; 
     node.pr = sr; node.pc = sc; node.br = br; node.bc = bc; node.ans ="";
     q.push(node);
     while (!q.empty()) 
     {
     node = q.front();
     q.pop();
     if (visBox[node.br][node.bc]) continue;
     visBox[node.br][node.bc] = 1;
     if (map[node.br][node.bc] == 'T') 
     {
     path = node.ans; return 1;
     }
     for (int i=0; i<4; i++) 
     {
     int nextr = node.br + dir[i][0];
     int nextc = node.bc + dir[i][1];
     int backR = node.br - dir[i][0];
     int backC = node.bc - dir[i][1];
     string ans = ""; 
     if (InMap(backR, backC) && InMap(nextr, nextc) && map[nextr][nextc] != '#'&& map[backR][backC] != '#' && !visBox[nextr][nextc])
     {
     if (Bfs2(node.pr, node.pc, backR, backC, node.br, node.bc, ans))
     {
     tmpNode.pr = node.br; tmpNode.pc = node.bc;
     tmpNode.br = nextr; tmpNode.bc = nextc;
     tmpNode.ans = node.ans + ans + pushes[i];
    q.push(tmpNode);
     }
     }
     }
     }
     return 0;
    }
    int main()
    {  int push=0,walk=0,len;
      string str;
        int i=1;
        int r=0;
     int sr, sc; 
     int br, bc; 
     int cases = 1; 
     cin>>R>>C;
     for (int r=1; r<=R; r++) 
     {
     for (int c=1; c<=C; c++)
     {
     cin >> map[r][c];
     if (map[r][c] == 'S'){ sr = r; sc = c; } 
     else if (map[r][c] == 'B') { br = r; bc = c; } 
     }
     }
     path = ""; 
     r= Bfs1(sr, sc, br, bc);
     if (r)
     {
        str=path;
        len= str.size();
        int a1= count(str.begin(),str.end(),'s');
        int a2= count(str.begin(),str.end(),'w');
        int a3= count(str.begin(),str.end(),'e');
        int a4= count(str.begin(),str.end(),'n');

        cout<< len - (a1+a2+a3+a4) << " " <<(a1+a2+a3+a4) << "\n";
     }
     else
     cout<< "-1"<<"\n";
      return 0;
    }

0 个答案:

没有答案