我在战争中走入了计算机行业

1 序言

  • 我已经退休了,我从1985年底开始从事计算机相关工作,退休前我主要从事嵌入式Linux方面的开发,中间也没有更换过职业,所以算下来我从事计算机行业在35年以上。

  • 中国1977年恢复高考,我是1980年入学的本科生,那时候基本上没有几个学校开设计算机专业,绝大多数人根本就不知道什么是计算机,如果谁有个计算器,那都是新鲜玩意,我们读大学时都是使用计算尺进行复杂运算的,这个东西大多数年轻人应该都没见到过,我找了张图片
    计算尺

  • 1984年本科毕业后去了部队,而且到了最基层的连队里,第一年我在一个高炮营里当排长,那年我年仅21岁,当时的部队里没有本科生,高中生、中专生就是有文化的了,冷不丁去了个本科生,大家都觉着这个人应该是无所不能的,我学的专业有点类似于自动化,机械也略通一些,去了部队不久副营长找我,说部队要经常出去拉练,炊事班行军用的炉子不好用,让我给重新设计一个,我明知道我不会干这个,但是不能说,因为我应该是一个无所不能的人,所以我只好硬着头皮上,研究了以前的炉子,拜访了几位炊事班长,用我那有限的机械制图能力就画出了一张行军炉的图纸,图纸被送到了附近一个挺大的厂里,过两天厂里工人给部队打了个电话,说是图纸看不懂,我正在怀疑我的图纸画得对不对时,工厂那边一个技术员接过了电话,说图纸能看懂,于是我如释重负。

  • 几天后,炉子做出来了,尽管没有严格按照图纸做,但是能用,试用了以后,营长决定一个连发一个,所以全营出去拉练、演习等做饭都用的是我的炉子,后来有个炊事班长告诉我,你那个炉子是真好用,但是费煤,我听着还是挺高兴的。

2 不懂装懂干上计算机

  • 1985年底,部队远赴云南参加对越自卫反击战的轮战,当时驻扎在云南文山州进行临战训练,训练完就要奔赴前线,当时我所在的高炮营已经扩编为高炮团,我们恰巧和军后勤部住在一个大院子里,我们是野战部队,人家是机关,所以平时没有来往。
  • 有一天,副团长找我(我和副团长私交不错),告诉我解放军总后勤部要在前线搞一个自动化指挥系统,我觉着这个事和我没有任何关系,所以也没当回事;又过了几天,副团长又来找我,说总后勤部要在前线搞自动化指挥系统,军后勤部到处找会计算机的人,找不到,我就推荐了你,我说我也不会呀,副团长说反正我推荐了你,我已经跟人家说了你会,明天军后勤部会找你的。
  • 第二天,军后勤部营房处长和财务处长找我,我就去了军后勤部,就是为了这个计算机的事,反正他们也不懂,肯定是问不出什么专业问题,他们估计对我这个人印象还不错,我了解了一下,似乎也不需要我做什么,第一件事是去北京买计算机,而我恰恰是北京的,正好可以回去看看,所以我就把这件我不会做的事给应了下来,走一步看一步吧。
  • 军后勤部的政治处为我办好了借调手续,我就顺理成章地从野战部队去军后勤部工作了,对我来说最大的好处是不用跟着野战部队去前线,住帐篷或者木板房,生活条件要好很多,我是1987年3月从云南前线撤下来的,在这一年多的时间里,我们一直住在砖瓦房里,有电和自来水,和野战部队的条件比起来,那是天壤之别。
  • 再后来,一个不懂计算机的我就去北京买计算机了,那时候北京中关村刚刚火起来,买了两台 IBM PC-XT,8086的 CPU,256K内存,10M的硬盘,640 x 320 的彩色显示器,运行 DOS,那是我第一次见到计算机。
  • 计算机买好后,我并没有立即返回,而是找了个地方,把我新买的计算机装了起来,那时候中关村有一个希望书店,专门卖计算机类的盗版书,我买了一些书,在电脑前钻研了一个星期,然后就胸有成竹地返回云南前线了。
  • 那时候,电脑里都固化了一个BASIC语言的解释器,所以电脑打开就可以用 BASIC 编程,我最先接触的计算机语言就是 BASIC,尽管现在已经没有人使用 BASIC,但当年我是从 BASIC 学会了编程的基本方法,后来开始学习汇编,因为当时并没有什么复杂的图形界面,而且 8086 的指令集远比后来的 80386、80486 要简单的多,所以汇编语言曾经在很长时间里成为我的主要使用语言,恐怕这跟我后来热衷于在嵌入式领域发展也有关系。
  • 之后,还接触过 Fortran 和 Pascal,这也是那时可以接触到的为数不多的高级语言;但是后来总后勤部搞自动化指挥系统时用的是 dBase II,所以我就开始学习 dBase II,沿着这条路下来,后来还用过 FoxBaseFoxPro,这几样都是与关系型数据库相关的编程语言,现在已经见不到了。

3 走上职业化

  • 但其实到1987年3月份我从云南前线撤下之前,尽管我从事了与计算机相关的工作,但还谈不上职业化,因为我的编制仍然是部队的战斗人员,只是借调到机关而已,即便是在机关工作,也只是个行政人员,并非职业化的计算机行业的从业者。
  • 但是,正是因为我在云南前线的这段计算机从业经历,使我在从云南前线撤下后得以调到成都军区的一个专门从事技术工作的单位工作,从那时起,我算是正式走进计算机行业,因为不仅我的日常工作就是与计算机打交道,而且我也有了工程师的职称。
  • 在这个新单位,我有幸见到了非常古老的计算机 DJS-3,不过我从来没有见过这台占了半层楼的计算机开过机,倒是见证了把这台计算机拆解的过程;在这里我第一次接触到了 UNIX,并开始学习 和使用 C 语言,从此在这个行业里工作了30多年。
  • 2020年,因怀念在云南的这段时光,特地去了云南,从昆明坐高铁到普者黑,从普者黑租了一辆 SUV 去了麻栗坡县城,在麻栗坡烈士陵园凭吊在战场上牺牲的战友,然后驱车再上老山,1986年的时候,我也这样上去过。

敬请关注 『我的博客』

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用深度优先搜索或广度优先搜索算法来解决这个问题。首先判断起点和终点是否可通行,如果不可通行则无法到达。然后从起点开始搜索,每次向四个方向扩展,如果扩展到的格点可通行且未被访问过,则将其加入搜索队列或栈,并标记为已访问。直到找到终点或搜索队列或栈为空时停止搜索。如果找到了终点,则说明可以到达,否则无法到达。 ### 回答2: #。其.表示该格点可以通过,#表示该格点不可通过。现在,extense通过了地图上一个设定好的起点,需要穿过这个迷宫,并到达一个设定好的终点。请为extense找出到达终点的最短路径,并输出路径长度。 这里采用广度优先搜索(BFS)算法来解决这个问题。 首先,我们需要定义一个队列来保存待搜索的节点。同时,我们还需要定义一个dist数组来保存每个节点到起点的最短距离。由于起点为给定的点,因此我们可以将起点的dist值设置为0,并将其压入队列。 之后,我们开始进行BFS搜索。对于当前搜索的节点,我们寻找所有与其直接相邻的节点,并计算它们到起点的距离(即当前节点到起点距离加1)。如果该节点未被访问过且可以通过(即为.),则将其dist值更新为新的距离,并将该节点压入队列等待后续搜索。此外,如果我们在搜索找到了终点,那么我们可以直接返回当前的dist值,此时就找到了最短路径的长度。 当队列所有的节点都被搜索完成后,我们就可以得到起点到终点的最短路径长度。当然,我们还可以通过回溯dist数组来获取具体的最短路径。 总之,采用BFS算法,我们可以非常高效地解决这个问题,用C++代码来实现如下: ```cpp #include <iostream> #include <queue> using namespace std; const int MAXN = 105; int n, sx, sy, ex, ey; char maze[MAXN][MAXN]; int dist[MAXN][MAXN]; bool vis[MAXN][MAXN]; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; int bfs(int x, int y) { queue<pair<int, int>> q; q.push({x, y}); dist[x][y] = 0; vis[x][y] = true; while(!q.empty()) { auto p = q.front(); q.pop(); if(p.first == ex && p.second == ey) break; for(int i = 0; i < 4; i++) { int nx = p.first + dx[i], ny = p.second + dy[i]; if(nx < 1 || ny < 1 || nx > n || ny > n) continue; if(maze[nx][ny] == '#') continue; if(vis[nx][ny]) continue; dist[nx][ny] = dist[p.first][p.second] + 1; vis[nx][ny] = true; q.push({nx, ny}); } } return dist[ex][ey]; } int main() { cin >> n >> sx >> sy >> ex >> ey; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) cin >> maze[i][j]; cout << bfs(sx, sy) << endl; return 0; } ``` ### 回答3: #,其.表示空地,#表示墙壁,你需要帮助extense寻找到从起点到终点的一条路径。 首先,我们需要对迷宫进行建模,可以采用二维数组来表示迷宫的状态。例如,可以使用0表示空地,使用1表示墙壁。同时,我们需要定义起点和终点的坐标,可以用(x1, y1)表示起点的坐标,用(x2, y2)表示终点的坐标。接下来,我们可以使用广度优先搜索算法来搜索从起点到终点的最短路径。 广度优先搜索算法的核心思想是,从起点开始,依次扩展其周围的节点,直到找到终点或者全部节点都被访问。在访问每个节点时,我们需要记录其距离和路径,以便在找到终点后回溯路径。具体实现时,可以使用队列或者数组来存储待访问的节点,并在访问过程更新它们的状态。 下面是一份样例代码,供参考: ``` const int MAXN = 1005; // 迷宫大小 int maze[MAXN][MAXN]; // 迷宫状态 int vis[MAXN][MAXN]; // 标记数组,记录节点是否被访问过 int dis[MAXN][MAXN]; // 距离数组,记录起点到每个节点的距离 pair<int, int> pre[MAXN][MAXN]; // 前驱数组,记录每个节点的前驱节点 int dx[4] = {-1, 0, 1, 0}; // 方向数组,表示上下左右四个方向 int dy[4] = {0, 1, 0, -1}; bool bfs(int x1, int y1, int x2, int y2) { queue<pair<int, int>> q; memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); dis[x1][y1] = 0; vis[x1][y1] = 1; q.push(make_pair(x1, y1)); while (!q.empty()) { pair<int, int> cur = q.front(); q.pop(); if (cur.first == x2 && cur.second == y2) { return true; // 找到终点,返回true } for (int i = 0; i < 4; i++) { int nx = cur.first + dx[i]; int ny = cur.second + dy[i]; if (nx < 1 || nx > n || ny < 1 || ny > n || vis[nx][ny] || maze[nx][ny]) { continue; // 节点越界或者被访问过或者是墙壁,跳过 } dis[nx][ny] = dis[cur.first][cur.second] + 1; vis[nx][ny] = 1; pre[nx][ny] = cur; q.push(make_pair(nx, ny)); } } return false; // 没有找到终点,返回false } void output_path(int x1, int y1, int x2, int y2) { if (x1 == x2 && y1 == y2) { return; // 起点和终点重合,返回 } output_path(pre[x2][y2].first, pre[x2][y2].second, x1, y1); printf("(%d,%d) ", x2, y2); // 输出路径 } int main() { // 读入迷宫数据 scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { char c; scanf(" %c", &c); maze[i][j] = (c == '#'); } } // 读入起点和终点坐标 int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); // 搜索最短路径 if (bfs(x1, y1, x2, y2)) { printf("找到了一条长度为%d的路径:\n", dis[x2][y2]); output_path(x1, y1, x2, y2); printf("\n"); } else { printf("无法到达终点!\n"); } return 0; } ``` 在实现过程,需要注意以下几点: 1. 搜索时需要判断节点是否越界,否则可能会导致程序崩溃。 2. 为了避免重复访问同一个节点,需要使用标记数组进行记录。 3. 在记录路径时,需要使用前驱数组,即对于每个节点,记录其是从哪个节点转移而来的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whowin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值