c++如何实现输入一个数值,输出对角线元素

我记得有一次我帮邻居老王修电脑。
他的电脑上有一个迷宫游戏。
这就像在 9 个方格中填写数字,然后沿对角线行走以清除关卡。
他不明白为什么每次都出不来,我就帮他读了代码,发现他的斜判断是错误的。
想一想。
如果数组很小,例如 3 ×3 ,则对角线将是第一行和第二列,以及第二行和第二列。
还有第1 行第3 列、第3 行第1 列的特殊情况,这个要单独计算。
由于老王的游戏基于五个元素,因此代码必须考虑两条对角线。
该代码首先打印主对角线,然后打印次对角线。
这是正确的。
当我们学习地址计算的时候,老师在纸上画图,一步步进行计算。
这很乏味,但是一旦你知道了公式,就很容易记住了。
LOC(a[i][j])=LOC(a[p][q])+((i-p)n+(j-q))t。
n 和 m 取决于行优先或列优先。
你需要明白这一点。
最近在读《算法导论》。
这样的地址计算有很多,感觉有点晕。
等等,还有一件事。
昨天我在新闻中看到,有些程序员正在使用高级语言,不需要自己计算这些地址。
编译器会自动处理它。
然而,理解基本原理可能会有所帮助。
例如,您知道如何优化内存访问并提高程序效率。
这个迷宫游戏实际上允许您使用递归算法。
每次选择一个方向,当你到达死胡同时原路返回。
代码中,scanf("%d",&d[x][y]);第一次使用的时候总是忘记加&,导致数据加载不正确。
因此,编程时要小心。
数组大小 5 是固定值。
如果您可以从键盘输入,您将拥有更多自由。
例如,如果用户输入 6 ,将创建一个 6 6 的数组。
然而,在这种情况下,对角线的判断发生了变化。
我在纸上计算了公式LOC(a[i][j]),但还是有点复杂。
t是每个元素占用的字节数。
例如,int 为 4 个字节,float 为 4 个字节。
该数组至少需要 (t)(m-p+1 )(n-q+1 ) 个字节来存储。
老王的电脑有4 GB内存。
存储迷宫游戏似乎没有问题。
在您的代码中,在 main 函数中返回 0。
请记得写下来。
否则,编译器会显示错误。
我认为地址计算不是很有用,除非你正在进行低级开发。
现在开发中使用的框架很多,直接调用库函数就足够了。
不过,如果知道原理,出现问题就不会惊慌。
对角线输出直接 printf("%d\n",d[x][x]);接下来是另一个 printf("%d\n",d[4 -x][x]);这个4 -x是什么意思?哦,这个数组的行数是 1 减 5 ?对于行,该值为 4 因此,下对角线是第一行的最后一列、第二行的倒数第二列,依此类推。
顺便说一句,我有一个问题。
地址公式中的p和q表示数组的起始地址在哪里。
是第一个元素的地址吗?

C++中怎么用new函数定义一个二维数组?

说白了:C++中创建二维动态数组有3 种方法。

第一个:使用常量定义第二维的大小。
像这样编写 new int[a][5 ] 是行不通的,编译器不允许这样做。
因为 b 未知,所以编译器不知道 int 是什么类型。
示例代码使用了new int[a][5 ],它本质上是一个int[5 ]的动态数组。
对于循环初始化,只需使用delete[]进行回收即可。

第二种:用指针模拟二维数组。
首先new int[a],然后循环new int[b]。
将每个int数组的首地址存储到int中。
访问时使用array2 D[i][j]。
注意内存不是连续的,必须先delete[]来回收每一行。
最后delete[]回收行指针。

第三种方法:使用向量。
std::vector 是一个动态数组。
std::vector> 是一个二维向量。
pArray2 D->resize(a),然后循环resize(b)。
访问 (pArray2 D)[i][j]。
使用delete pArray2 D进行回收。

如何选择? 这取决于需求。
常数法是最简单的,但第二维是固定的。
指针方式灵活,但管理困难。
向量是最方便的,但速度较慢。

由您决定哪一个适合您。