Dijkstra algorthim停止工作

时间:2015-12-09 03:48:19

标签: c++ dijkstra shortest-path greedy

我正在开发一个项目,以找到2d阵列(200 * 250)中50000点的最短路径。为了简单起见我只用2 * 2开始。 从点我可以去N,W,E,S(没有获得矩阵) 我有3个2d阵列。 Map [] [] =它保存0-255的二进制值 已知[] [] = 0或1. 1表示它找到了该点的最短路径。在开始时所有值都是0。 Dist [] [] =最短路径的目的地。在开始时所有值都是9999 我有三个函数,一个是dijkstra()。

 void dijkstra(){
 dist[0][0]=0;
 int i,j,counter=0;
 while(counter<=9){

    if(counter<9){
        cout<<"counter: "<<counter<<endl;
    }
    returnmin2(0,0);
    known[x][y]=1;

    returnS(x);
    returnN(x);
    returnE(y);
    returnW(y);

    if(s!=-1){
        if(known[s][y]==0){
            cost=sqrt(1+(pow((map[s][y]-map[s-1][y]),2.0)));
            cost1=cost+dist[s-1][y];

            if(cost1<dist[s][y]){
                dist[s][y]=cost1;
                path[s][y]=150;
                cout<<"Distance: "<<dist[s][y]<<endl;
            }
        }
    }

    if(n!=-1){
        if(known[n][y]==0){

            cost=sqrt(1+(pow((map[n][y]-map[x][y]),2.0)));
            cost1=cost+dist[n+1][y];

            if(cost1<dist[n][y]){
                dist[n][y]=cost1;
                path[n][y]=50;
                cout<<"Distance: "<<dist[x][y]<<endl;
            }
        }
    }

    if(e!=-1){
        if(known[x][e]==0){

            cost=sqrt(1+(pow((map[x][e]-map[x][e-1]),2.0)));
            cost1=cost+dist[x][e-1];

            if(cost1<dist[x][e]){
                dist[x][e]=cost1;
                path[x][e]=100;
                cout<<"Distance: "<<dist[x][w]<<endl;
            }
        }
    }

   if(w!=-1){
        if(known[x][w]==0){
            cost=sqrt(1+(pow((map[x][w]-map[x][w+1]),2.0)));
            cost1=cost+dist[x][w+1];

            float d= dist[x][w+1];
            if(cost1<dist[x][w]){
                dist[x][w]=cost1;
                path[x][w]=200;
                cout<<"Distance: "<<dist[x][w]<<endl;
            }
        }
    }
    counter++;
}

}

函数returnmin找到未知的最小距离。

float returnmin2(int i,int j){
    float min2,q=0;
    for(i;i<3;i++){
        for(j;j<3;j++){
            float q=dist[i][j];
            if((i==0) && (j==0)){
                min2=q;
                x=i;
                y=j;
            }
            if(q<min2){
                min2=q;
                x=i;
                y=j;
            }
        }
    }
    if(known[x][y]==0){
        x=x;
        y=y;
    }
    else if(known[x][y]!=0){
            if(y<2){
                returnmin2(x,y+1);
            }
            else {
                returnmin2(x+1,0);
            }

    }
}

returnS,N,W,E是告诉我们走哪条路的函数

int returnS(int v){
    if(v!=2){
        s=v+1;
    }
    else{
        s=-1;
    }
}

由于某种原因,当计数器到达时,程序停止工作。我现在仍然确定原因。一开始它工作正常。但出于某种原因,当它到达2,2点时,它会错过。如果您希望我包含openfile函数和main

,请告诉我

0 个答案:

没有答案