代码拉取完成,页面将自动刷新
class Solution {
public:
/* 从中心开始,按照一个从小到大的菱形的顺序向外输出,即可满足题意,也不会引入额外的运算储存资源 */
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> res({{r0, c0}});
/* 为了顺利便利到边缘,求取上界 ———— 即曼哈顿距离在棋盘中的最大值 */
int limit = 0;
/* 取出原点到四个边界点之间的距离 */
vector<int> rAlter = {r0+c0, C-c0+R-2, R-1-r0+c0, R+C-r0-c0-2};
/* 距离中最大的一个作为上界 */
for (int x : rAlter)
limit = max(limit, x);
/* 按照距离从小到达的顺序便利周围的点 ———— 初始化时就已即把原点加入类结果,所以 r 从 1 开始遍历即可 */
for (int r = 1; r <= limit; r++) {
/* 中心点的右下侧边 */
for (int i = 0; i < r; i++) {
int j = r - i;
// cout << r0 + i << ", " << c0 + j << endl;
if (c0 + j < C && c0 + j >= 0 && r0 + i < R && r0 + i >= 0)
res.push_back({r0+i, c0+j});
}
/* 中心点的左下侧边 */
for (int i = 1; i <= r; i++) {
int j = r - i;
// cout << r0+i << ", " << c0 - j << endl;
if (c0 - j < C && c0 - j >= 0 && r0 + i < R && r0 + i >= 0)
res.push_back({r0+i, c0-j});
}
/* 中心点的左上侧边 */
for (int i = 0; i < r; i++) {
int j = r - i;
// cout << r0 - i << ", " << c0 - j << endl;
if (c0 - j < C && c0 - j >= 0 && r0 - i < R && r0 - i >= 0)
res.push_back({r0-i, c0-j});
}
/* 中心点的右上侧边 */
for (int i = 1; i <= r; i++) {
int j = r - i;
// cout << r0 - i << ", " << c0 + j << endl;
if (c0 + j < C && c0 + j >= 0 && r0 - i < R && r0 - i >= 0)
res.push_back({r0-i, c0+j});
}
}
return res;
}
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。