进阶5.大阶乘计算
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int m, n;
// 读取矩阵的行数和列数
if (!(cin >> m >> n)) return 0;
vector<vector<int>> matrix(m, vector<int>(n));
vector<vector<bool>> visited(m, vector<bool>(n, false));
// 读取矩阵数据
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
// 定义四个方向:下(1,0), 右(0,1), 上(-1,0), 左(0,-1)
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int x = 0, y = 0; // 初始位置 (0, 0)
int dir = 0; // 初始方向为 0 (向下)
int total = m * n;
for (int i = 0; i < total; ++i) {
// 输出当前位置的数,控制行末无多余空格
cout << matrix[x][y];
if (i != total - 1) {
cout << " ";
}
// 标记当前位置为已访问
visited[x][y] = true;
// 计算下一个位置
int nx = x + dx[dir];
int ny = y + dy[dir];
// 判断下一个位置是否越界或已访问过
if (nx < 0 || nx >= m || ny < 0 || ny >= n || visited[nx][ny]) {
// 如果遇到阻碍,改变方向 (向左转 90 度)
dir = (dir + 1) % 4;
// 重新计算改变方向后的下一个位置
nx = x + dx[dir];
ny = y + dy[dir];
}
// 更新当前位置
x = nx;
y = ny;
}
cout << endl;
return 0;
}
总结
方向数组 :定义两个数组 dx 和 dy 来控制行和列的移动。按照题目要求的"下、右、上、左"顺序:
- 向下:行坐标 +1,列坐标 +0
(1, 0) - 向右:行坐标 +0,列坐标 +1
(0, 1) - 向上:行坐标 -1,列坐标 +0
(-1, 0) - 向左:行坐标 +0,列坐标 -1
(0, -1)
访问标记 :使用一个与原矩阵同等大小的布尔矩阵 visited 来记录某个位置是否已经被取过数。
转向判断 :每次按当前方向试探下一步。如果下一步越界(超出矩阵范围)或者对应的 visited 已经是 true,就将方向索引加 1 并对 4 取模,实现向左转 90 度。
翻译
I. 操作系统的用户界面
为了执行计算机用户请求的操作,操作系统必须能够与这些用户进行通信。操作系统中处理这种通信的部分通常被称为用户界面 。较早的用户界面(称为shell)通过使用键盘和显示器屏幕的文本 消息与用户进行通信。更现代的系统通过图形用户界面 (GUI------发音为"GOO-ee")来执行此任务,在这种界面中,要操作的对象(如文件和程序)在显示器上以图形方式 表示为图标 。这些系统允许用户通过使用几种常见输入设备之一来发出命令。例如,可以使用计算机鼠标来点击 或拖动屏幕上的图标。图形艺术家经常使用专用定点设备或触控笔来代替鼠标,或者在几种类型的手持设备上也是如此。最近,高精度触摸屏 的进步允许用户直接用手指操作图标。尽管今天的GUI使用二维图像投影系统,但允许人类用户通过3D投影系统、触觉 传感设备和环绕声音频再现系统与计算机进行通信的三维界面是当前研究的主题。
尽管操作系统的用户界面在建立机器的功能性 方面起着重要作用,但该框架仅仅充当计算机用户与操作系统真正核心之间的中介(图 2B-1)。某些操作系统允许用户在不同的界面之间进行选择,以获得针对该特定用户最舒适的交互体验,这一事实强调了用户界面与操作系统内部部件之间的这种区别。
