簡體   English   中英

Matrix Traversal打印所有和最短路徑 - 無限循環

[英]Matrix Traversal to print all and shortest path - infinite loop

#include<iostream>
#include<random>
#include<ctime>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;

int path_checker(vector<pair<int,int> > path, int i, int j)
{
    //cout<<"path_checker"<<endl;
    std::vector<pair<int, int> >::iterator it;
    for(it = path.begin(); it!=path.end();it++)
        if(it->first == i && it->second ==j)
            return 1;
    return 0;
}

int isVertex(int i, int j, int n)
{
    //cout<<"isVertex"<<endl;
    if((i>=0) && (j>=0))
    {
        if((i <= n) && (j <= n))
            return 1;
    }
    return 0;
}


void printAllPathsU(int *array, int i, int j, int n, vector<pair<int,int> >     path,int index)
{
   // cout<<"PrintAllPathsU_first"<<endl;
   // vector<pair<int,int>> path2 = {0};
    if((i == n) && (j == n))
    {
        if((path_checker(path,i,j)))
        {
        cout<<"Inside printing path"<<endl;
        //vector<pair<int,int> >::iterator it;
        for(int i = 0; i < path.size();i++)
            cout<<"a["<<path[i].first<<"]["<<path[i].second<<"] ";
        return;
        }
        else
        {
            path.push_back(make_pair(i,j));
            cout<<"Inside printing path"<<endl;
        //vector<pair<int,int> >::iterator it;
            for(int i = 0; i < path.size();i++)
                cout<<"a["<<path[i].first<<"]["<<path[i].second<<"] ";
            return;
        }
    }
if((*((array+i*n)+j) == 1) && (!path_checker(path,i,j)))
{
    //cout<<path.size()<<endl;
    path.push_back(make_pair(i,j));
    index++;
    //len++;
    if(isVertex(i,j-1,n))
        printAllPathsU((int *)array,i,j-1,n,path,index);
    if(isVertex(i-1,j,n))
        printAllPathsU((int *)array,i-1,j,n,path,index);
    if(isVertex(i,j+1,n))
        printAllPathsU((int *)array,i,j+1,n,path,index);
    if(isVertex(i+1,j,n))
        printAllPathsU((int *)array,i+1,j,n,path,index);
}
else if((*((array+i*n)+j) == 1) && (path_checker(path,i,j)))
{
    //cout<<"inside second else"<<endl;
    return;
}
else if(*((array+i*n)+j) == 0)
{
   // cout<<"inside third else"<<endl;
    return;
}
}

    void printAllPaths(int *array, int n)
{
vector<pair<int,int> > path;
//cout<<"PrintALLPaths"<<endl;
printAllPathsU(array, 0, 0, n, path, 0);
}




int main()
{       //populating matrix
    int n;
    cout << "Enter value of n (for n x n matrix): ";
    cin >> n;
    int i;
    int j;
    int k;
    int test=1;
    int array[n][n];
    int randomval;
    int total_elements = n*n;
    int counter_0 = 0;
    int max_0 = 0.2 * total_elements;
    cout << "Number of zeros(20% of n*n) in matrix: ";
    cout<<max_0<<endl;
    int count=0;
    srand(time(0));
    for(i = 0;i < n;i++)
    {
        for(j = 0;j<n;j++)
        {
            array[i][j]=-1;
        }
    }
    while(count < total_elements)
        {
            i=rand()%n;
            j=rand()%n;
            if(array[i][j]==1 || array[i][j]==0)
            {
                continue;
            }
            else if(array[i][j] == -1)
            {   
                count+=1;
                if(i==0 && j==0)
                {
                    array[i][j]=1;
                }
                else if (counter_0 < max_0)
                {
                    counter_0+=1;
                    array[i][j] = 0;
                }
                else if(counter_0 >= max_0)
                {   
                    test+=1;
                    array[i][j] = 1;

                }

            }
            else{continue;}
        }
    cout<<"# of 1s:"<<test<<" & # of 0s:"<<counter_0<<endl;
    cout<<"Elements Populated:"<<count<<endl;
    cout<<"Total Elements in matrix:"<<total_elements<<endl;
    if(counter_0 < max_0)
    {   cout<<"adding more zeros"<<endl;
        while(k < (max_0 - counter_0))
        {
            i = rand()%n;
            j = rand()%n;
            if(array[i][j] == 0)
            {

            }
            else
            {
            array[i][j] = 0;
            k+=1;
            }
        }
    }
    for(i = 0;i < n;i++)
    {
        for(j = 0;j<n;j++)
        {
            cout<<array[i][j]<<" ";
        }
        cout<<endl;
    }


//printing paths
if(array[1][0]==0 && array[0][1]==0)
{
    cout<<"No Possible paths homie #snorlaxiseverywhere";
}else
{
//printing paths
    printAllPaths((int *)array, n);
}
return 0;
}

問題是遍歷填充了1和0的* n矩陣,矩陣中的0的數量是元素總數的20%,並打印所有路徑,然后打印來自[0] [0]的最短路徑]到[n] [n],使用四個方向:上,下,左,右。 到目前為止,我已嘗試實現打印所有可能的路徑。 但是,我陷入了無限循環中

else if((*((array+i*n)+j) == 1) && (!path_checker(path,i,j)))
{
...
}

我討論path.size()來檢查每個實例中的大小變化,輸出有點像:

35
48
37
...and so on infinitely (values ranging approx between 30-50)

任何想法如何糾正這個?

編輯:更改了一些邏輯,而不是無限循環。 但所有函數調用都通過函數內的“second else”和“third else”退出 - printAllPathsU(...)。

謝謝!

只要問題是如何“打印所有路徑”,你應該有一個無限循環,因為有無限多的路徑。 如果問題是如何打印所有非自相交路徑,那么這個改述就會提示如何解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM