一、题目
先来分享我做过的题目:
这是洛谷上P1443 马的遍历。
先奉上解题代码:
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
struct point
{
int x, y;
};
int main()
{
int dx[8] = { -1,-2,-2,-1,1,2,2,1 }, dy[8] = { -2,-1,1,2,2,1,-1,-2 };
int n, m, x0, y0, ans[402][402];
queue<point>q;
memset(ans, -1, sizeof(ans));
cin >> n >> m >> x0 >> y0;
ans[x0][y0] = 0;
point tp = { x0, y0 }, p;
q.push(tp);
while (!q.empty())
{
tp = q.front();
q.pop();
for (int i = 0; i < 8; i++)
{
int x = dx[i] + tp.x, y = dy[i] + tp.y;
if (x<1 || x>n || y<1 || y>m || ans[x][y] != -1)
continue;
ans[x][y] = ans[tp.x][tp.y] + 1;
p = { x,y };
q.push(p);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cout << ans[i][j] << " ";
}
cout << endl;
}
return 0;
}
在我看来,解决这道题目最关键的不是马的遍历本身,只要充分理解了题目的意思,知道了马是以中国象棋中的走“日”字的方式在二维数组中运动的就行。最为重要的应该是马的遍历中数据的存储方式和调用方式。在这个代码中,马的位置信息是用队列来存储的,太优美了。用此方式完美的保证了马的遍历循序不会出现问题,保证了对于数字的标记不会出现一匹马在一条路遍历所有位置的问题。这就有一点bfs的感觉。也确实,我之前就是往bfs的方向去想的,但是没有解决。
再来看一道题目
这是洛谷P1095 守望者的逃离。
也先奉上代码
#include<iostream>
using namespace std;
long long m, s, t, run = 0, teleport = 0;
int main()
{
cin >> m >> s >> t;
for (int i = 1; i <= t; i++)
{
run += 17;
if (m >= 10) //魔法够
{
m -= 10;
teleport += 60;
}
else //不够
m += 4;
if (teleport > run)
run = teleport;
if (run >= s)
{
cout << "Yes" << "\n" << i;
exit(0);
}
}
if (run < s)
cout << "No" << "\n" << run;
return 0;
}
这很明显是一道动态规划的题目。根据我自己的思路,我是希望过一秒就比较一下最小的时间,虽然答案也是这样,但是我将过程想复杂了。不敢相信居然用这么简短的代码就完成的指令。
其中这段代码:
for (int i = 1; i <= t; i++)
{
run += 17;
if (m >= 10) //魔法够
{
m -= 10;
teleport += 60;
}
else //不够
m += 4;
if (teleport > run)
run = teleport;
if (run >= s)
{
cout << "Yes" << "\n" << i;
exit(0);
}
}
时间是同时流逝的,在同一时间,代码完成了对于跑动、停止、瞬移的三项操作。并对这三项操作的结果进行比较,从而得到最简便的方式。其实仔细一想,在这个代码中,操作也是双线程的。只要没有触发teleport>run这个指令,其实守望者就一直在奔跑。一旦触发了这个指令,守望者之前的奔跑就都变成了瞬移。
二、学习
接下来讲一讲最近的学习成果,由于最近出了一周的差,去完成学校三下乡的工作。在Java的学习上落下了不少。之前学习的知识也有所遗忘。这两天我也主要是以找回状态,过一遍之前的知识点为主。目前在黑马的教学中已经学到了静态。先对最近的知识做一个总结。
1、ArryList 在 Java 中是一个可调整大小的数组实现,它提供了动态数组的功能。ArrayList
类位于 java.util
包中。ArrayList
可以存储所有类型的对象。
以下是关于ArryList的基本用法:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// 创建一个空的 ArrayList
ArrayList<String> list = new ArrayList<>(); //注意<>中需要是一个类
list.add("Element"); // 在列表末尾添加元素
list.add(0, "Element at index 0"); // 在指定位置添加元素
String element = list.get(0); // 访问第一个元素
list.remove("Element"); // 删除指定元素(如果有多个相同的元素,只删除第一个)
list.remove(0); // 删除指定位置的元素
list.contains("Element"); // 判断列表是否包含指定元素
list.isEmpty(); // 判断列表是否为空
list.size(); // 获取列表的大小
list.set(0, "New Element"); // 修改指定位置的元素
}
}
2、静态static
关键字主要用于内存管理。static
可以应用于变量、方法、代码块以及内部类。下面是static
关键字关于变量和方法的用法:
- 静态变量(类变量):
- 使用
static
关键字声明的变量称为静态变量或类变量。 - 静态变量在内存中只有一份拷贝,无论创建多少个对象,静态变量都共享同一份存储。
- 静态变量可以通过类名直接访问。
- 使用
- 静态方法:
- 静态方法是属于类的,而不是属于对象的。因此,即使没有创建类的实例,也可以调用静态方法。
- 静态方法内部只能直接访问类的静态变量和静态方法,不能直接访问类的实例变量和实例方法。
除了对于这两个知识点的学习,我还学习了一些方法的使用方法。学习的内容还是比较少的,在之后的学习中,需要抓紧时间,弥补一周的空缺,尽快的完成对于Java的学习。