东华大学OJ 二维数组中等 暗恋(递归出现的错)

二维数组传入为函数参数的时候必须指定第二维长度。而且不能传入变量。就很离谱。但是这并不能阻挡我要用递归的心。

做题思路

  1. 题目分解:
    1. 输入。就是一个普通的二维数组输入。这里因为只有两种情况可以直接写为bool数组(空间能少一点就少一点)
    2. 判断。因为是需要一个正方形的面积。那么最大的肯定就是r,c中较小数的平方,即r2r^2r2或者是c2c^2c2。这也是最大的可能面积。判断是否纯色即在这个区域内是否数组值相同即可。
    3. 最优解。若最大的不行则以此减少1的边长判断是否满足情况。遍历判断时就需要按照一定顺序依此划分正方形。这个过程高度相似,直接封装成一个函数即可。
  2. 实现思路:
    1. 最开始就是得要有一个开始的x,y作为判断的标准。然后就是注意下标别越界了。

    2. 我的实现思路就是按照从左到右,从上到下的顺序判断。如果不满足条件且划分的正方形并没有把给定矩形的水平长度用完则开始的starty不变,startx++(就是把需要判断的小正方形水平移动)。如果该正方形已经碰到侧边且没有满足条件就startx恢复初始0,starty++(小正方形回到向下移动)。再不行就减少正方形的边长(代码中edge)

AC代码

在递归变量需要++或者–时,需要前置,否则就会死循环。如fun(++a)

#include <bits/stdc++.h>

using namespace std;

bool brick[200
### 关于东华大学OJ平台中二维数组从右上到左下遍历的解题思路 对于给定的二维数组,要实现从右上角至左下的遍历方式,通常涉及对角线方向的数据访问模式。这种特定路径上的元素处理可以通过调整索引来完成。 在提供的代码片段中,存在一些逻辑用于计算两条特殊对角线上元素乘积与商之和的操作[^1]: ```cpp for(j=0;j<m;j++) { x1=a[j][j]; // 这就是左上到右下的元素值,易找 for(i=0;i<m;i++) { if((m-1)==i+j) { x2=a[i][j];//这是左下到右上的元素 break; } } } ``` 然而,这段代码主要关注的是两个主对角线(即从左上到右下以及从右上到左下),而不是整个矩阵按指定路线遍历的方法。为了真正实现从右上往左下的遍历并获取相应位置的数值,可以采用如下方法: #### 方法一:基于行列坐标的转换 通过改变循环结构来适应新的遍历顺序。具体来说,在外层循环控制当前所处的斜率k(即`row + col = const`),内层则迭代满足此条件的所有(row, col)组合。 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入方阵大小n*n int matrix[n][n]; // 填充matrix... for(int k = 0; k < 2 * n - 1; ++k){ for(int row = max(0, k-(n-1)); row <= min(k, n-1); ++row){ int col = k - row; cout << "Element at (" << row << ", " << col << ") is: " << matrix[row][col]<< endl; } } return 0; } ``` 这种方法能够有效地按照从右上向左下的轨迹读取每一个元素,并且适用于任意尺寸的方形矩阵。 #### 方法二:利用辅助数据结构存储结果后再输出 另一种策略是创建一个新的列表或其他容器类型用来保存沿所需路径提取出来的元素,最后再统一打印出来。这种方式可能更直观但也稍微增加了空间复杂度。 上述两种方案都可以很好地解决如何在一个二维数组里执行从右上方移动到左下方的任务。选择哪种取决于实际应用场景和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值