我有像这样的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;
}
答案 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";
}