华为机考真题 -- 螺旋数字矩阵

题目描述:

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:给出数字 个数 n 和行数 m(0 < n ≤ 999,0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出 2,3...n,最终形成一个 m 行矩阵。小明对这个矩阵有些要求:

1.每行数字的个数一样多

2.列的数量尽可能少

3.填充数字时优先填充外部

4.数字不够时,使用单个*号占位

输入描述:

两个整数,空格隔开,依次表示 n、m

输出描述:

符合要求的唯一矩阵

示例1:

输入

9 4

输出

1 2 3

* * 4

9 * 5

8 7 6

说明:9 个数字写成 4 行,最少需要 3 列

示例2:

输入

3 5

输出

1

2

3

*

*

说明:3 个数字写 5 行,只有一列,数字不够用*号填充

示例3:

输入

120 7

输出

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 19

45 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 63 20

44 83 114 115 116 117 118 119 120 * * * * * * 99 64 21

43 82 113 112 111 110 109 108 107 106 105 104 103 102 101 100 65 22

42 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 23

41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24

C++源码:

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void fillSpiralMatrix(int n, int m) {
	int column = (n + m - 1) / m;
	vector<vector<string>> mapGame(m, vector<string>(column, "*"));
	vector<int> dx = { 0, 1, 0, -1 }, dy = { 1, 0, -1, 0 };

	int directX = 0, directY = 0, dir = 0;
	for (int i = 1; i <= n; ++i) { 
		mapGame[directX][directY] = to_string(i);
		if (i == n)
			break;

		while (true) { 
			int nx = directX + dx[dir], ny = directY + dy[dir];
			if (nx < 0 || nx >= m || ny < 0 || ny >= column || mapGame[nx][ny] != "*") {
				dir = (dir + 1) % 4;
			}
			else {
				directX = nx;
				directY = ny;
				break;
			}
		}
	}

	int i = 0;
	while (i < m) {
		int j = 0;
		while (j < column) {
			cout << mapGame[i][j] << " ";
			++j;
		}
		cout << endl;
		++i;
	}
}

signed main() {
	int n, m;
	cin >> n >> m;
	fillSpiralMatrix(n, m);

	system("pause");
	return 0;
}
相关推荐
lqj_本人6 分钟前
鸿蒙next版开发:使用HiChecker检测问题(ArkTS)
华为·harmonyos
CWPIN217 分钟前
《鸿蒙生态:开发者的机遇与挑战》
华为·harmonyos
zhongcx0111 分钟前
鸿蒙NEXT应用示例:切换图片动画
华为·harmonyos·鸿蒙·鸿蒙next
槿花Hibiscus15 分钟前
C++基础:Pimpl设计模式的实现
c++·设计模式
用户405478783748233 分钟前
深度学习笔记 - 使用YOLOv5中的c3模块进行天气识别
算法
十七算法实验室42 分钟前
Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)
算法·决策树·随机森林·机器学习·支持向量机·matlab·启发式算法
黑不拉几的小白兔1 小时前
PTA部分题目C++重练
开发语言·c++·算法
迷迭所归处1 小时前
动态规划 —— dp 问题-买卖股票的最佳时机IV
算法·动态规划
写bug的小屁孩1 小时前
websocket身份验证
开发语言·网络·c++·qt·websocket·网络协议·qt6.3
chordful1 小时前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划