旋转数字矩阵 od
结构得记一下,否则还是刷不出来。参考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 处理多个 caseif (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")