将文本文件转换为数组C ++

时间:2017-04-09 16:28:50

标签: c++

我有像这样的data.txt文件

 1 9
 2 5
 3 4
 4 3
 5 2
 6 1

现在我想将它放入我的阵列,这是关于障碍

我希望把价值观作为我的障碍

1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 3 3 2 1
1 2 3 4 4 4 4 4 3 2 1
1 2 3 4 5 5 5 4 3 2 1
1 2 3 4 5 9 5 4 3 2 1
1 2 3 4 5 5 5 4 3 2 1
1 2 3 4 4 4 4 4 3 2 1
1 2 3 3 3 3 3 3 3 2 1 
1 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1
像这样。怎么做?

我对SSCCE非常不满意。但我上传了我的代码,以获得它的要点。

int main()
{
    int i,j,x,y,x1,y1;

    for(i=0; i < 12; ++i)
        for(j=0; j < 12; ++j)  RES[i][j]=0;  // way
    RES[1][5]=3;                         // start
    RES[10][5]=5;                        // goal
    RES[3][4]=RES[3][5]=RES[3][6]=2;     // block
    x=1;
    y=5;


    for(i=0; i < 12; ++i)
        for(j=0; j < 12; ++j)  R[i][j]=254;  // walkable

    R[1][5]=253;                         // start
    R[10][5]=0;                          // finish

    R[3][4]=R[3][5]=R[3][6]=255;         // pathless, bunker

    for(j=0; j < 12; ++j)  R[0][j] =255;
    for(j=0; j < 12; ++j)  R[11][j]=255;
    for(i=0; i < 12; ++i)  R[i][0] =255;
    for(i=0; i < 12; ++i)  R[i][11]=255;

    ofstream RRR;
    RRR.open("OutWalk.txt", ios::out | ios::app);
    if(!RRR) RRR.open("OutWalk.txt", ios::out);


    for(N=0; N < Nmax; ++N)
    {
        cout<<"  N = " << N << endl;
        for(i=1; i < 11; ++i)
            for(j=1; j < 11; ++j)
            {

                if(R[i][j] == N)
                {
                    if(R[i+1][j] == 253)
                    {
                        x=i+1;    // start
                        y=j;
                        goto PATH;
                    }
                    if(R[i+1][j] == 254) R[i+1][j]=N+1;
                    if(R[i-1][j] == 253)
                    {
                        x=i-1;    // start
                        y=j;
                        goto PATH;
                    }
                    if(R[i-1][j] == 254) R[i-1][j]=N+1;
                    if(R[i][j+1] == 253)
                    {
                        x=i;    // start
                        y=j+1;
                        goto PATH;
                    }
                    if(R[i][j+1] == 254) R[i][j+1]=N+1;
                    if(R[i][j-1] == 253)
                    {
                        x=i;
                        y=j-1;
                        goto PATH;
                    }
                    if(R[i][j-1] == 254) R[i][j-1]=N+1;            // start

                };

            }; // R[12][12]
    };    // N



PATH:
    if(R[x+1][y] > R[x-1][y])
    {
        x1=x-1;
        y1=y;
    }
    else
    {
        x1=x+1;
        y1=y;
    }
    if(R[x1][y1] > R[x][y+1])
    {
        x1=x;
        y1=y+1;
    }
    if(R[x1][y1] > R[x][y-1])
    {
        x1=x;
        y1=y-1;
    }
    RES[x1][y1]=1;
    if(R[x1][y1] == 0)
    {
        RES[x1][y1]=5;
        goto END;
    }
    x=x1;
    y=y1;
    goto PATH;


END:
    cout << "  N = " << N << endl;
    RRR << endl;

    RRR << endl;
    RRR << " Number of circuit = " << N << "  Goal: x = "<< x1 << " y = "<< y1 << endl;
    for(i=10; i > 0; i--)
    {
        RRR << endl;
        for(j=1; j < 11; ++j) RRR << R[i][j] << " \t ";
    }
    RRR << endl;
    for(i=10; i > 0; i--)
    {
        RRR << endl;
        for(j=1; j < 11; ++j) RRR << RES[i][j] << "  ";
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是从您拥有的数据中创建所需模式的简单方法。我将使用数组而不是从文件中读取数据,但如果您愿意,也不应该这样做。

基本上,诀窍是查看输出中每个位置的每个项目的索引。如果您不是输出所需的实际值,而是查看数组中值的索引,它看起来像这样:

5 5 5 5 5 5 5 5 5 5 5 
5 4 4 4 4 4 4 4 4 4 5 
5 4 3 3 3 3 3 3 3 4 5 
5 4 3 2 2 2 2 2 3 4 5 
5 4 3 2 1 1 1 2 3 4 5 
5 4 3 2 1 0 1 2 3 4 5 
5 4 3 2 1 1 1 2 3 4 5 
5 4 3 2 2 2 2 2 3 4 5 
5 4 3 3 3 3 3 3 3 4 5 
5 4 4 4 4 4 4 4 4 4 5 
5 5 5 5 5 5 5 5 5 5 5 

现在,想想每个位置的坐标是什么。如果我们把它写成坐标,它看起来像这样:

<0,0> <1,0> <2,0> <3,0> <4,0> ... etc.
<0,1> <1,1> <2,1> <3,1> <4,1> ... etc.
<0,2> <1,2> <2,2> <3,2> <4,2> ... etc.
<0,3> <1,3> <2,3> <3,3> <4,3> ... etc.
... etc.

那么这些坐标如何与索引匹配?我们显然希望这种关系与它们与广场中心的距离有关。因此,让我们从所有其他坐标中减去中心坐标:

<-5,-5> <-4,-5> <-3,-5> <-2,-5> ... etc.
<-5,-4> <-4,-4> <-3,-4> <-2,-4> ... etc.
<-5,-3> <-4,-3> <-3,-3> <-2,-3> ... etc.
<-5,-2> <-4,-2> <-3,-2> <-2,-2> ... etc.
...etc. 

那么关系是什么?注意如何沿着顶部和左边缘,-5?我们希望我们最外面的结果是5。在所有第2行和第2列中,都有-4。我们希望其余的值为4。所以这里出现了一种模式。看起来您需要取坐标的绝对值的最大值来计算索引。然后使用索引获取放在那里的值。

所以把它们放在一起,它看起来就像这样(我用文件代替读取只是使用数组,但你可以从文件构建数组):

    int distances[] = { 9, 5, 4, 3, 2, 1 };
    const int centerX   = 5;
    const int centerY   = 5;

    for (int x = 0; x < 11; x++)
    {
        for (int y = 0; y < 11; y++)
        {
            int largest = std::max (abs(x - centerX), abs(y - centerY));
            std::cout << distances [ largest ] << " ";
        }

        std::cout << "\n";
    }