Два вопроса с ++, которые немного меняются, но очень разные ответы - PullRequest
0 голосов
/ 09 марта 2011

В последнее время я делаю упражнение об алгоритме с C ++. Упражнение здесь: Пой

Я нахожу два очень запутанных вопроса. Я пишу класс MAZE, и в MAZE есть три основные функции: int left_path();int right_path();int mini_path(); и функция для печати ответов:

void display(){
    cout<<left_path()<<" "<<right_path()<<" ";
    cout<<mini_path()<<endl;
}

программа может работать правильно. Как мы видим, функция display () может быть простой; Я пишу так

* * 1010

только одно изменение, однако программа не может работать, это как бесконечный цикл.

следующий вопрос: кадр функции mini_path вот так

int maze::mini_path(){
    ini();
    queue<pair<int,int> > q;
    q.push(make_pair(x,y));
    while(!q.empty()){

        pair<int,int> tmp=q.front();
       q.pop();

       int t=...;
       if(E){
          return t;
       }
       if(E){
        S
       }
       if(E){
         S
       }
       if(E){
          S
       }
       if(E){
          S
       } 

   }
    return -1;
}  

если в конце есть «return -1», функция работает правильно, иначе функция возвращает случайное большое число.

Программа находится в одном файле, и я использую компилятор оружия.

Я не показываю полные коды, потому что я думаю, что никто не хочет их видеть. Я просто хочу спросить, какие проблемы могут привести к странным поведениям.

исходный код (упрощено для вопроса2):

    typedef enum {LEFT=-1,RIGHT=1,UP,DOWN} direction;

    ifstream fin("file_test3.txt");
    class maze{
    public:
        maze(){input();}
        int mini_path();
        void input();
        void display(){
            cout<<mini_path()<<endl;
        }
    private:
        bool is_not_dest(){
            return !(x==d_x && y==d_y);
        }
        void ini_dir()
        {
            if(e_x==0) dir=DOWN;
            else if(e_x==height-1) dir=UP;
            else if(e_y==0) dir=RIGHT;
            else dir=LEFT;
        }
        void ini(){
            x=e_x;
            y=e_y;
            path_lenth=1;
            ini_dir();
        }
        direction dir,d;
        int width,height,maze_map[40][40],path_lenth;
        int x,y,e_x,e_y,d_x,d_y;
    };
    void maze::input()
{
    fin>>width>>height;
    char sym;
    for(int i=0;i<height;++i)
        for(int j=0;j<width;++j){
            fin>>sym;
            if(sym=='#')
                maze_map[i][j]=1;
            else if(sym=='.')
                maze_map[i][j]=0;
            else if(sym=='S'){
                maze_map[i][j]=-1;
                e_x=i;
                e_y=j;
            }
            else {
                maze_map[i][j]=-2;
                d_x=i;
                d_y=j;
            }
        }
}

int maze::mini_path()
{
    ini();
    queue<pair<int,int> > q;

    if(dir==LEFT) {maze_map[x][--y]=2;}
    else if(dir==RIGHT) {maze_map[x][++y]=2;}
    else if(dir==UP) {maze_map[--x][y]=2;}
    else {maze_map[++x][y]=2;}

    q.push(make_pair(x,y));
   while(!q.empty()){
        pair<int,int> tmp=q.front();
        q.pop();
        x=tmp.first;
        y=tmp.second;
        int t=maze_map[x][y]+1;
        if((x==d_x && (y-d_y==1 || y-d_y==-1)) ||(y==d_y && (x-d_x==1||x-d_x==-1))){
            return t;
        }
        if(maze_map[x-1][y]==0){
            maze_map[x-1][y]=t;
            q.push(make_pair(x-1,y));
        }
        if(maze_map[x+1][y]==0){
            maze_map[x+1][y]=t;
            q.push(make_pair(x+1,y));
        }
        if(maze_map[x][y-1]==0){
            maze_map[x][y-1]=t;
            q.push(make_pair(x,y-1));
        }
        if(maze_map[x][y+1]==0){
            maze_map[x][y+1]=t;
            q.push(make_pair(x,y+1));
        }
    }
    return -1;
}

main()
{
    int n;
    fin>>n;
    while(n-- >0){
        class maze m;
        m.display();
    }
}

Ответы [ 3 ]

5 голосов
/ 09 марта 2011

Я вижу это!Видишь?:)

#include <iostream>

using namespace std;

int foo(int bar)
{
    cout << bar << endl;
    return bar;
}

int _tmain(int argc, _TCHAR* argv[])
{
    cout << foo(1) << foo(2) << foo(3) << endl;
    return 0;
}

Вывод:

3
2
1
123
1 голос
/ 09 марта 2011

относительно вопроса 1: порядок, в котором вызываются функции, будет другим.первое решение будет вызывать их в следующем порядке:

  1. right_path
  2. left_path
  3. mini_path

второе решение приводит к следующему порядку:

  1. mini_path
  2. right_path
  3. left_path

, поэтому решение, которое вы, вероятно, хотите, это:

void display(){
    cout<<left_path()<<" ";
    cout<<right_path()<<" ";
    cout<<mini_path()<<endl;
}
0 голосов
/ 09 марта 2011

Недостаточно информации, чтобы ответить на первый вопрос;оба кода эквивалентны.

[Редактировать: проверить другие ответы.В любом случае, оба кода должны быть эквивалентными: в вашем коде есть ошибки.]

По поводу второго вопроса, я полагаю, что «возврат -1» помечает «невозможный путь» вЛабиринт, поэтому, когда вы удаляете его, ваша программа перестает работать.

В задаче лабиринта алгоритм обратного отслеживания перемещается квадрат за квадратом.Когда из квадрата нет возможного пути, этот квадрат должен быть помечен как отсутствие пути.

...