2025-10-25 学习日记

发布于 2025-10-25 12:00 679 字 4 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. 3414 -- Pots 关键词: 问题分析: 倒水的问题,找到最短的倒水至任一容器中符合条件,但是要求打印该路径 核心思路: 不记录路径就是一个 bfs 简单问题,但是现在要记录后就比较复杂,来分情况解决 怎么记录? 容器的状态要随着一起记录,还有就是记录路径是一个字符串的集合,所以用数组来装 记忆化问题...

今日学习记录

1. 3414 — Pots

关键词:bfs 问题分析: 倒水的问题,找到最短的倒水至任一容器中符合条件,但是要求打印该路径

核心思路: 不记录路径就是一个 bfs 简单问题,但是现在要记录后就比较复杂,来分情况解决

  1. 怎么记录? 容器的状态要随着一起记录,还有就是记录路径是一个字符串的集合,所以用数组来装
  2. 记忆化问题 其中的倒水方法会导致死循环,所以必须要记忆化,可是在记录路径的时候,每一条路径都可以说是唯一的,而且数组直接要比较费时间,所以可以记录容器状态来记忆化
  3. 优化 首先用数组来装字符串集合,会爆内存,考虑到这几句话都是固定的,所以我们可以把这几句话映射到别的地方 , 比如0代表第一句 话,1代表第二句话,这样就减少了内存开销 **最终代码:
#include <iostream>

#include <cstdlib>

#include <vector>

#include<algorithm>

#include <cmath>

#include <fstream>

#include<cstring>

#include<climits>

#include<queue>

#include<set>

using namespace std;

int a,b,c;

string s;

int bfs(){

    queue<string> q;

    q.push("");

    queue<pair<int,int> > sq;

    pair<int,int> pr = make_pair(0,0);sq.push(pr);

    vector<vector<bool> > vis(a+1,vector<bool>(b+1,false));

    vis[0][0] = true;

    int ans = 0;

    while(!sq.empty()){

        int size = sq.size();

        for(int i = 0;i<size;i++){

            pair<int,int> p = sq.front();sq.pop();

            string strs = q.front();q.pop();

            if(p.first==c || p.second==c){

                s = strs;

                return ans;

            }

            //fill

            if(!vis[a][p.second]) sq.push(make_pair(a,p.second)),q.push(strs+'0'),vis[a][p.second] = true;

            if(!vis[p.first][b]) sq.push(make_pair(p.first,b)),q.push(strs+'1'),vis[p.first][b] = true;

            //drop

            if(!vis[0][p.second]) sq.push(make_pair(0,p.second)),q.push(strs+'2'),vis[0][p.second] = true;

            if(!vis[p.first][0]) sq.push(make_pair(p.first,0)),q.push(strs+'3'),vis[p.first][0] = true;

            //pour

            int sd = p.first>=b-p.second?b:p.first+p.second,ft = p.first>=b-p.second?p.first+p.second-b:0;

            if(!vis[ft][sd]) sq.push(make_pair(ft,sd)),q.push(strs+'4'),vis[ft][sd] = true;

            ft = p.second>=a-p.first?a:p.first+p.second;

            sd = p.first>=a-p.second?p.first+p.second-a:0;

            if(!vis[ft][sd]) sq.push(make_pair(ft,sd)),q.push(strs+'5'),vis[ft][sd] = true;

        }

        ans++;

    }

    return -1;

}

int main() {

    cin>>a>>b>>c;

    int re = bfs();

    if(re==-1) cout<<"impossible";

    else {

        cout<<re<<endl;

        for(int i = 0;i<s.size();i++){

            char d = s[i];

            if(d=='0') cout<<"FILL(1)";

            else if(d=='1') cout<<"FILL(2)";

            else if(d=='2') cout<<"DROP(1)";

            else if(d=='3') cout<<"DROP(2)";

            else if(d=='4') cout<<"POUR(1,2)";

            else if(d=='5') cout<<"POUR(2,1)";

            cout<<endl;

        }

    }

    return 0;

}

学到的点:

  1. 记录路径的技巧

执笔 手写

随机文章

加载中...