结构得记一下,否则还是刷不出来。参考leetcode 螺旋矩阵2 No59。
区别的地方在于:
1、里面的列数自己决定,需要判断最小列
2、数量小于行数,单独打印输出。
3、其他情况1:要考虑 count已经写完,单矩阵有空余,需要输出‘*’
4、其他情况2:count需要在两个地方控制,一个是while(负责大圈停止的)一个是for循环(count<= size防止数超了)
#include <iostream>
#include "vector"
using namespace std;
void print(int size, int row) {
int a = 0;
for (int i = 1; i < size + 1; i++) {
cout<<i<<endl;
}
int count = row - size;
while(count--) {
cout<<'*'<<endl;
}
return;
}
int main() {
int size,row, col;
while (cin >> size >> row) { // 注意 while 处理多个 case
if (size <= row) {
print(size,row); // 如果一列就能放下就放下
return 0;
} else {
col = size / row + 1;//用最少得列数,用总数量/行数 +1 即列数。
}
vector<vector<int>> vec(row,vector<int>(col));
int start_x = 0;
int start_y = 0;
int offset = 1;
int count = 1;
int i,j;
while(count <= size) {
i = start_x;
j = start_y;
//向右
for (j = start_y; j < col - offset && count <= size; j++) {
vec[i][j] = count++;
}
//向下
for (i = start_x; i < row - offset && count <= size; i++) {
vec[i][j] = count++;
}
//向左
for (; j > start_y && count <= size; j--) {
vec[i][j] = count++;
}
//向上
for (; i > start_x && count <= size; i--) {
vec[i][j] = count++;
}
start_x++;
start_y++;
offset+=1;
}
for(int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[i].size(); j++) {
if (vec[i][j] == 0) {
cout<<'*'<<' ';
} else {
cout<<vec[i][j]<<' ';
}
}
cout<<endl;
}
}
return 0;
}
// 64 位输出请用 printf("%lld")