c++ - 围绕二维数组做一个圆圈
问题描述
我无法在二维数组中转一圈以螺旋形式输出元素。我尝试了这段代码,但它输出的元素不足,我尝试在循环之外创建一些 if 语句以涵盖通用算法不输出的所有情况。你能帮忙提出一些管理正确输出的方法吗?
代码
#include <iostream>
#include <algorithm>
//#include <cmath>
using namespace std;
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int r, c;
cin >> r >> c;
int r_beg = 0, r_end = r - 1, c_beg = 0, c_end = c - 1;
int **m = new int*[r];
for (int i = 0; i < r; i++)
{
m[i] = new int[c];
for (int j = 0; j < c; j++)
{
cin >> m[i][j];
}
}
for (int runs = min(r, c) / 2; runs--;) {
for (int i = c_beg; i < c_end; i++)
cout << m[r_beg][i] << " ";
for (int i = r_beg; i < r_end; i++)
cout << m[i][c_end] << " ";
for (int i = c_end; i > c_beg; i--)
cout << m[r_end][i] << " ";
for (int i = r_end; i > r_beg; i--)
cout << m[i][c_beg] << " ";
r_beg++;
c_beg++;
r_end--;
c_end--;
}
if (r <= c && c_beg <= c_end) {
for (int i = c_beg; i <= c_end; i++)
cout << m[r_end][i] << " ";
}
else if (r >= c && r_beg <= r_end) {
for (int i = r_beg; i <= r_end; i++)
cout << m[i][c_end] << " ";
}
for (int i = 0; i < r; i++)
delete[] m[i];
delete[] m;
return 0;
}
例子:
输入:
3 3
1 2 3
4 5 6
7 8 9
输出:1 2 3 6 9 8 7 4 5
例如,如果您有 3x10 矩阵。它不输出。
输入:
3
7
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
输出:应该达到 13,但在 8 处停止。
解决方案
如图所示,代码向中心循环,直到两个维度中较小的一个被耗尽。但是,如果该较小尺寸具有奇数尺寸,则中心行或列的部分分别没有被打印出来。你可以在你的外循环之后用一些特殊情况处理来覆盖那个:
for (int runs = std::min(r, c) / 2; runs--;)
{
// ...
}
if(c < r)
{
if(c & 1)
{
for (int i = r_beg; i <= r_end; i++)
// ^ (!)
// don't forget to print last element: there's no second loop
// that would print the corner element a second time now!
std::cout << m[i][c_end] << " ";
}
}
else
{
// handles the square matrix case as well
if(r & 1)
{
for (int i = c_beg; i <= c_end; i++)
std::cout << m[r_beg][i] << " ";
}
}
推荐阅读
- angular - 我们可以将一个环境构建文件重用到另一个构建中而不用 npm run build in angular
- node.js - 如何以编程方式使用 NPM?
- r - 比较列中的每一行字符串并添加条件以评估并在新列中打印结果
- algorithm - F#。解决 Project Euler #3 问题时因超时而终止
- android - 无法获取以“content://0@media/”开头的 URI 的文件句柄
- python - 在 Raspbian 上用 Python 打开程序?
- postgresql - SQL 正则表达式量词操作数在 postgres 9.5.16 上无效,适用于 9.6.12
- python - 查找每列的最新行
- wpf - WPF:更改按钮鼠标悬停状态的文本和图像颜色
- python - 我无法计算我的答案并且总是给出答案错误