题目描述:
输入n和m,然后转着圈的把数字都打印出来
举例
输入
4 5
输出
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
其中n是行数 m是列数
解题思路:比n阶螺旋矩阵再复杂点,思路大体一致,感觉没啥好说的,for循环不断遍历就行
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m; //输入行与列
int** ans = new int* [n]; //新建二维数组用于存储结果
for (int i = 0; i < n; i++)
ans[i] = new int[m] {0};
int left = 0, right = m - 1; //二维数组左端0,右端m-1
int up = 0, down = n - 1; //二维数组上限从0开始,下限n-1
int count = 1; //填充的数
while (left <= right && up <= down)
{
for (int i = left; i <= right; i++) //从左往右
{
ans[up][i] = count++;
}
up++; //上限下移一次
if (up > down) //如果上限过低了,判断跳出
break;
for (int i = up; i <= down; i++) //从上往下
{
ans[i][right] = count++;
}
right--; //右端左移一次
if (left > right)
break;
for (int i = right; i >= left; i--) //从右往左
{
ans[down][i] = count++;
}
down--;
if (up > down)
break;
for (int i = down; i >= up; i--) //从下往上
{
ans[i][left] = count++;
}
left++;
if (left > right)
break;
}
for (int i = 0; i < n; i++) //输出结果
{
for (int j = 0; j < m; j++)
cout << ans[i][j] << "\t";
cout << endl;
}
return 0;
}