文章目录
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
题解代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n = matrix.size();
if (n <= 0) return {};
int m = matrix[0].size();
vector<int> res;
// 设定一个数组用于判断这个位置是否被访问过
vector<vector<bool>> vt(n, vector<bool>(m, false));
// 设定x,y的上右下左,用于修改坐标
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for (int i = 0; i < n * m; ++i) {
vt[x][y] = true;
res.push_back(matrix[x][y]);
// 每次插入结束后,修改访问坐标
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= m || vt[a][b]) {
d = (d + 1) % 4;
// 如果碰到拐点,重新修改访问坐标(x,y)
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};
米哈游游戏开发第一题
题解代码:
#include <iostream>
#include <vector>
using namespace std;
int k = 0;
char arr[26] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
void PrintCircle(vector<vector<char>>& vv, int col, int row, int start) {
int endX = col - 1 - start;
int endY = row - 1 - start;
for (int i = start; i <= endX; i++) {
vv[start][i] = arr[(k++) % 26];
}
if (start < endY) {
for (int i = start + 1; i <= endY; ++i) {
vv[i][endX] = arr[(k++) % 26];
}
}
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; --i) {
vv[endY][i] = arr[(k++) % 26];
}
}
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; --i) {
vv[i][start] = arr[(k++) % 26];
}
}
}
void fun(vector<vector<char>>& vv, int col, int row) {
if (col <= 0 || row <= 0) return;
int start = 0;
while (col > start * 2 && row > start * 2) {
PrintCircle(vv, col, row, start);
++start;
}
}
int main() {
int n, m;
while (cin >> m >> n) {
vector<vector<char>> vv(m, vector<char>(n));
fun(vv, n, m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (j == 0) cout << vv[i][j];
else cout << ' ' << vv[i][j];
}
cout << endl;
}
}
return 0;
}
如有不同见解,欢迎留言讨论~~~