1.28小结

这几天主要在看数据结构的网课,主要了解了一下算法时间复杂度、空间复杂度的表达方法、计算方式还有关于线性表的一些知识(大部分理论为主)

今天下午进行了第二次测试(只ac了一道题,还有两道只过了一部分),测试结束看完了题解准备梳理一下再进行补题

还写了一道机器人搬重物(卡了好几天)

1.28小结_第1张图片

一、算法时间复杂度

主要含义为时间开销与问题规模n的关系                                                                                         算法的时间复杂度的具体表示为:用大写的 O 来体现算法时间复杂度如O(f(n)),称之为 大 O 记数法。(采取高阶表示法)

高价表示法(一般低阶在时间上有所差异,但是相对于高阶来说就比较小了)

1.28小结_第2张图片

时间复杂度的运算规则:

1.28小结_第3张图片

1.28小结_第4张图片

二、空间复杂度

主要含义为空间开销与问题规模n的关系   

空间开销就是代码中开辟的空间的空间大小(变量、函数、递归等都会开辟出相应的空间)

可以通过一个简单的图形和一些简答的算法来进行理解、

1.28小结_第5张图片

特别值得注意的一点就是我们只需要关注与其复杂度相关的变量,一个程序中的很多代码都与空间复杂度无关

1.28小结_第6张图片

1.28小结_第7张图片

三、线性表

线性表与逻辑结构(数据结构三要素之一)关系十分紧密

通过一张图可以很清晰的了解其定定义

1.28小结_第8张图片

线性表的最基础的操作如:插入、删除、增加等

1.28小结_第9张图片

1.28小结_第10张图片

线性表又可以分为几大类

顺序表就是其中之一

1.28小结_第11张图片

P1126 机器人搬重物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 1.61.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:

  • 向前移动 1步(Creep);
  • 向前移动 2步(Walk);
  • 向前移动 3步(Run);
  • 向左转(Left);
  • 向右转(Right)。

每个指令所需要的时间为 1 秒。请你计算一下机器人完成任务所需的最少时间。

输入格式

第一行为两个正整数 N,M (1≤N,M≤50)N,M (1≤N,M≤50),下面 N 行是储藏室的构造,0 表示无障碍,1 表示有障碍,数字之间用一个空格隔开。接着一行有 4 个整数和 1 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 E,南 S,西 W,北 N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式

一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 −1。

1.28小结_第12张图片

输入输出样例

输入 

9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S

输出 

12

思路:个人认为这道题是真的坑啊(借助别人的题解勉强搞懂)

1.只要有一个格点在障碍物上,那么与其相对应的四个点机器人都会无法到达

2.机器人是一个球,其中心点无法达到边界,所以我们敲代码时机器人能到达的范围为(N-1)*(M-1)

3.我们设定方向数组后需注意每个方向均有三种移动情况

4.机器人直径为1.6(对于这个我是借鉴别人的题解进行处理的)

上面的这些坑点注意之后,下面的代码还是耗费了很长时间才搞出来

代码:

#include
#include
using namespace std;
int mod(int x) {
	return (x + 4) % 4;
}
struct pt {
	int x, y, dir, step;
	pt() {}
	pt(int a, int b, int c, int d) :x(a), y(b), dir(c), step(d) {}
};
const int movx[] = { 0,1,0,-1 }, movy[] = { 1,0,-1,0 };
int a[60][60];
bool vis[60][60][5];//x,y坐标和方向
int n, m;
pt st, ed;
void bfs() {
	queue q;
	bool flag = false;//用于判断最后机器人是否能到达
	st.step = 0;
	q.push(st);
	vis[st.x][st.y][st.dir] = true;
	while (!q.empty()) {
		pt t = q.front();
		q.pop();
		if (t.x == ed.x && t.y == ed.y) {
			cout << t.step << endl;
			flag = true;
			break;
		}
		for (int i = 1; i <= 3; i++) {
			int u, v;
			u = t.x + i * movx[t.dir];
			v = t.y + i * movy[t.dir];
			if (u <= 0 || u >= n || v <= 0 || v >= m || a[u][v] == 1) {//范围判断
				break;
			}
			if (vis[u][v][t.dir]) {
				continue;
			}
			vis[u][v][t.dir] = true;
			q.push(pt(u, v, t.dir, t.step + 1));
		}
		if (!vis[t.x][t.y][mod(t.dir + 1)]) {
			vis[t.x][t.y][mod(t.dir + 1)] = true;
			q.push(pt(t.x, t.y, mod(t.dir + 1), t.step + 1));
		}
		if (!vis[t.x][t.y][mod(t.dir - 1)]) {
			vis[t.x][t.y][mod(t.dir - 1)] = true;
			q.push(pt(t.x, t.y, mod(t.dir - 1), t.step + 1));
		}
	}
	if (!flag) {
		cout << -1 << endl;
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%d", &a[i][j]);
			if (a[i][j] == 1) {
				a[i - 1][j - 1] = a[i - 1][j] = a[i][j - 1] = 1;//一个格点受阻,周围的都无法到达
			}
		}
	}
	cin >> st.x >> st.y >> ed.x >> ed.y;
	char c;
	cin >> c;
	switch (c) {//选择方向
	case 'E':
		st.dir = 0; break;
	case 'S':
		st.dir = 1; break;
	case 'W':
		st.dir = 2; break;
	case 'N':
		st.dir = 3; break;
	}
	bfs();
}

你可能感兴趣的:(寒假预备役学习,数据结构,算法,学习)