一、题目
先来分享我做过的题目:
这是洛谷P1216数字三角形
这道题目我本来是使用的dfs,再比较全局变量的大小,从而找到最大值。但是在选择数据结构时,弄了好久,再一看标签,好叭,我又开始使用dp的方法去解决问题。最后就是说,这个居然被我搞出来了。
代码是这样的:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010][1010];
int main()
{
int r;
cin >> r;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> a[i][j];
}
}
for (int i = r - 1; i >= 1; i--)
{
for (int j = 1; j <= r; j++)
{
a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);
}
}
cout << a[1][1] << endl;
return 0;
}
这里有一个很精彩的地方就是,我是采用的一个倒三角的形式将数据存储的。于是,到了最后的a[1][1]的时候,a[1][1]就是我们需要的答案了。相反,如果使用正三角,就需要在最后比较a[r][j]的大小。
这个是洛谷P1605迷宫
很明显,这是一道考验搜索的题目。我用的是dfs。用dfs探索所用的路径,再使用ans计数。完成搜索后,输出ans。代码如下:
#include<iostream>
using namespace std;
int maze[10][10] = { 0 }, n, m, t, sx, sy, fx, fy, ans = 0;
int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 };
void dfs(int x, int y)
{
if (x == fx && y == fy)
{
ans++;
return;
}
for (int i = 0; i < 4; i++)
{
if (maze[x + dx[i]][y + dy[i]] == 1)
{
maze[x + dx[i]][y + dy[i]] = 0;
dfs(x + dx[i], y + dy[i]);
maze[x + dx[i]][y + dy[i]] = 1;
}
}
}
int main()
{
int x, y;
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
maze[i][j] = 1;
}
}
for (int i = 0; i < t; i++)
{
cin >> x >> y;
maze[x][y] = 0;
}
maze[sx][sy] = 0;
dfs(sx, sy);
cout << ans << endl;;
return 0;
}
我先将通路标记为1,将障碍物标记为0。如果是走过的地方,将1改为0。采用这样的循环 for (int i = 0; i < 4; i++);已实现四个方位的递归。最后在走完了所用的路径之后,计数器ans也完成了计数,最后输出ans。
二、学习
接下来讲一讲最近的学习成果。
现在也是抓紧的去学习,目前还在学习IO流。
也就较最近学习的一些知识进行一些总结:
Java I/O(输入/输出)流是Java标准库提供的一套用于读写数据的API。Java I/O 流主要分为两大类:字节流(Byte Streams)和字符流(Character Streams)。每种流都有输入(Input)和输出(Output)两种类型。
字节流(Byte Streams)
字节流主要用于处理二进制数据,如图片、视频等文件。字节流以字节(byte)为单位进行数据的读写。
- 输入流(InputStream):从源读取数据到程序中的流。
FileInputStream
:用于从文件系统中的文件获取输入字节。ByteArrayInputStream
:从字节数组中获取输入字节。ObjectInputStream
:从输入流中读取对象。
- 输出流(OutputStream):将程序中的数据写入到目的地中的流。
FileOutputStream
:用于将数据写入文件系统中的文件。ByteArrayOutputStream
:将数据写入一个字节数组。ObjectOutputStream
:将对象写入输出流。
字符流(Character Streams)
字符流主要用于处理文本数据,如读取和写入文本文件。字符流以字符(char)为单位进行数据的读写,并且提供了对字符编码的支持。
- 输入流(Reader):从源读取字符数据到程序中的流。
FileReader
:用于从文件系统中读取文本文件。BufferedReader
:包装其他Reader对象,提供缓冲字符输入以及按行读取文本的功能。InputStreamReader
:是字节流到字符流的桥梁,可以将字节流转换为字符流。
- 输出流(Writer):将程序中的字符数据写入到目的地中的流。
FileWriter
:用于将数据写入文件系统中的文本文件。BufferedWriter
:包装其他Writer对象,提供缓冲字符输出以及按行写入文本的功能。OutputStreamWriter
:是字符流到字节流的桥梁,可以将字符流转换为字节流。
缓存流(Buffered Streams)是Java I/O流中的一种高级流,它是对低级流(如文件流、网络流等)的封装,通过在内存中开辟缓冲区来提高I/O操作的效率。缓存流分为字节缓存流和字符缓存流两大类,分别用于处理二进制数据和文本数据。
字节缓存流
- BufferedInputStream:这是一个字节输入流,它封装了另一个输入流,并为其提供缓冲功能。通过创建一个内部缓冲区数组,BufferedInputStream能够一次性从底层输入流中读取多个字节到缓冲区中,然后再从缓冲区中逐个返回字节给调用者。这样可以减少实际读取的次数,从而提高效率。
- BufferedOutputStream:这是一个字节输出流,它封装了另一个输出流,并为其提供缓冲功能。BufferedOutputStream同样使用了一个内部缓冲区数组,当调用者写入数据时,数据会先被写入到缓冲区中,当缓冲区满或者显式调用flush方法时,缓冲区中的数据才会被写入到底层输出流中。这样可以减少实际写入的次数,提高写入效率。
字符缓存流
- BufferedReader:这是一个字符输入流,它提供了缓冲的字符输入以及按行读取文本的功能。BufferedReader同样使用了一个内部缓冲区,但它以字符为单位进行操作。BufferedReader的readLine方法能够一次读取一行文本,这对于读取文本文件特别有用。
- BufferedWriter:这是一个字符输出流,它提供了缓冲的字符输出以及按行写入文本的功能。BufferedWriter同样使用了一个内部缓冲区,当调用者写入字符数据时,数据会先被写入到缓冲区中,当缓冲区满或者显式调用flush方法时,缓冲区中的数据才会被写入到底层输出流中。BufferedWriter还提供了newLine方法,用于写入一个平台无关的行分隔符。
目前的进度就在这里了,打算的是在IO流时稍微仔细的看一下,争取再用两天的时间学习一下。之后多线程应该也会仔细学习一下,最后的内容应该就是很快的过掉了。