学习总结(7月24日)

一、题目

先来分享我做过的题目:

这是洛谷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流时稍微仔细的看一下,争取再用两天的时间学习一下。之后多线程应该也会仔细学习一下,最后的内容应该就是很快的过掉了。

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值