C++的问题
提示:通过i,j,k的运算写出与其对应的一维数组的变量的下标。
例如,当i,j,k的值分别为0,0,0时,表达式的值为0,故实际访问的是a[0];当i,j,k的值分别为2,3,1时,表达式的值为34,故实际访问的是a[34];
哪位大佬懂,求代码,急! 展开
想象有一个柜子,柜子中每个格子可以保存一个int的数,这个柜子的长宽高分别为10、4、3,设常数为a,b,c ,单位就是格子,而I、J、K代表各个方向的索引,设:线性索引为index。
思路:先考虑平面(见下图),I为横向索引表示列,J为竖向索引表示行,图中格子的数字是两个方向的索引号,格子内是线性索引,由于每行的宽度一定为a,因此J行第一个格子的索引为a*J,而I为该行上的横向索引,因此(I,J)所指向的格子的线性索引为a*J+I。举例,假设I=7,J=2,则单一平面上变换后的线性索引 index=a*J+I=10*2+7=27。
另外,请注意,在推导平面索引时可以看到我们并不需要行数,而只用到了长度(列数),即b不参与计算,记住这点后面有用。
那么有了平面的思考,推广到三维就好办了,由上图可知,一个平面的格子总数为a*b,因此K所在平面左上角格子的线性索引为K*a*b,所以(I,J,K)指定的格子在线性表中的索引为 index=K*a*b+J*a+I。举例,当I,J,K={6,1,2}时,index=2*10*4+1*10+6=96。
同样的,与平面一样,三维索引变换为线性索引时,是不需要第三维的高度c参与计算的(此题中的3)。
特地用Excel画了两张示意图,希望你能看明白其算法,所以任何解题先学习或自己推导算法,以后遇到同类型就可以套公式即可,也可以写成自定义类直接调用即可。
希望能帮到你。
2*3*4 3*3 加2减1 34