3月13日(进阶5)

进阶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;
}

总结

方向数组 :定义两个数组 dxdy 来控制行和列的移动。按照题目要求的"下、右、上、左"顺序:

  • 向下:行坐标 +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)。某些操作系统允许用户在不同的界面之间进行选择,以获得针对该特定用户最舒适的交互体验,这一事实强调了用户界面与操作系统内部部件之间的这种区别。

相关推荐
x_xbx2 小时前
LeetCode:27. 移除元素
数据结构·算法·leetcode
云泽8082 小时前
C++ map 底层探秘:从结构设计到 operator [] 实现的全解析
数据结构·c++·算法
小O的算法实验室2 小时前
2026年EAAI SCI1区TOP,基于LLM驱动的多群粒子群算法动态通信策略生成方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
午彦琳2 小时前
leetcode hot 100_49,128
算法·leetcode·职场和发展
郝学胜-神的一滴2 小时前
深度解析:Python元类手撸ORM框架,解锁底层编程魔法
数据结构·数据库·python·算法·职场和发展
big_rabbit05022 小时前
[算法][力扣219]存在重复元素2
数据结构·算法·leetcode
闻缺陷则喜何志丹3 小时前
【构造 前缀和】P8902 [USACO22DEC] Range Reconstruction S|普及+
c++·算法·前缀和·洛谷·构造
摸鱼仙人~3 小时前
动态规划求解 20 个通用模板
算法·动态规划
记忆多3 小时前
c++内联函数
算法