201604-4 ccf 游戏 (三维记录 + BFS)

本文分享了一道中文游戏题目的解题经验,通过引入时间维度优化无访问标记的广度优先搜索(BFS),实现更高效的路径寻找。文章详细介绍了从初始TLE到最终AC的全过程,包括剪枝尝试、特殊优化技巧及其代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:
游戏

题目大意:
中文题啊!!!

解题思路:
真的是让我学到了的一题!!!
一开始看到题,二话不说上了普通的无访问标记式的bfs,结果TLE了,只得了20分,想想确实会超时。
于是想了一些剪枝方法,还是不行。因为突然发现好像还可能需要走回去,才会有最优解。于是冥思苦想,无果。决定上网看看各路神仙写法!!!
找到一个觉得想法特别清奇的,就是用思维数组标记访问,比普通vis多出来一个时间维度。
那么我们把在时间a~b这段时间的vis[r][c][t]标记为1,访问过的标记,第一次遇到终点,退出bfs,就是答案了。

因为a,b取值最大为100,网格也最多100*100,所以最短到达终点只需300步这样
所以最坏的时间复杂度是O(300*n*m)

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

int n,m,t;
int vis[150][150][350];

struct node{
    int x,y,time;
    node(int _x, int _y,int _t):x(_x),y(_y),time(_t){}
};

int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};

int bfs(){
    queue<node> q;
    q.push(node(1,1,0));
    vis[1][1][0] = 1;
    while(!q.empty()){
        node tmp = q.front();
        q.pop();
        int tt = tmp.time + 1;
        for(int i=0; i<4; ++i){
            int tx = tmp.x + dir[i][0];
            int ty = tmp.y + dir[i][1];
            if(tx == n && ty == m){
                return tt;
            }
            if(vis[tx][ty][tt] || tx <=0 || tx >n || ty <=0 || ty >m) continue;
            vis[tx][ty][tt] = 1;
            q.push(node(tx,ty,tt));
        }
    }
}

int main(){
    memset(vis, 0, sizeof(vis));
    cin>>n>>m>>t;
    while(t--){
        int r,c,a,b;
        cin>>r>>c>>a>>b;
        for(int i=a; i<=b; ++i) vis[r][c][i] = 1;
    }

    cout<<bfs()<<endl;
    return 0;
}
<think>好的,我现在需要回答用户关于CCF CSP基础内容的问题。首先,我得回顾一下用户提供的引用资料,确保信息准确。用户提到了三个引用,其中引用[1]和[2]是关于考试介绍和备考策略的,引用[3]则涉及具体的知识点如vector和unordered_set的使用。 首先,我应该明确CCF CSP考试的基本信息,比如考试形式、题型和评分标准。根据引用[1]和[2],考试分为5道编程题,主要考察算法和编程能力,使用C++、Java或Python,且每题得分独立。这部分需要清晰呈现,让用户对考试结构有整体认识。 接下来是核心知识点,引用[3]提到了数据结构如vector和unordered_set的使用,这属于STL库的内容。我需要将这些知识点分点列出,并简要说明每个部分的重要性。例如,vector的动态数组特性、二维数组的应用,以及unordered_set的哈希表实现和常见操作。 然后,备考建议部分需要结合引用[2]的三个月冲刺计划,强调基础巩固、真题训练和时间管理。这里要给出具体的学习步骤,比如分阶段复习和每日刷题安排,帮助用户制定合理的学习计划。 在生成相关问题环节,要确保问题覆盖用户可能关心的方面,如考试难度、编程语言选择、常见错误和评分标准。这些问题应该引导用户进一步探索,同时也能检验他们对已有信息的理解。 需要注意的是,回答中要自然地插入引用标识,如[^1]和[^2],尤其是在提到考试结构和备考策略时。同时,保持语言简洁,结构清晰,避免使用过多技术术语,让不同基础的用户都能理解。 最后,检查是否符合系统级指令:行内公式是否正确使用$符号,独立公式是否用$$(虽然这里可能用不上),中文回答,问题生成是否相关,引用标识是否正确添加。确保所有引用来源准确对应,没有遗漏或错误。 总结起来,我需要组织信息为以下几个部分:考试概述、核心知识点、备考建议和相关问题,每个部分结合引用内容,确保回答的准确性和实用性。</think>### CCF CSP基础知识介绍 #### 一、考试概述 CCF CSP认证考试是中国计算机学会组织的编程能力认证,重点考察**算法设计与实现能力**。考试形式为**5道编程题**,限时5小时,支持C++、Java、Python三种语言,每题得分独立(0-100分),按总分评定等级[^1]。 #### 二、核心知识点 1. **数据结构** - **`vector`动态数组**:初始化方式如$vector<int> arr(10,0)$,支持动态扩容,常用于替代传统数组[^3] - **二维数组处理**:通过嵌套vector实现,例如$vector<vector<int>> matrix(m, vector<int>(n))$ - **无序集合`unordered_set`**:基于哈希表实现,支持$O(1)$时间复杂度的查找,接口包含`insert()`、`find()`、`erase()` 2. **算法能力** - 排序算法(快速排序、归并排序) - 搜索算法(DFS、BFS- 动态规划(背包问题、最长子序列) - 图论算法(最短路径、最小生成树) 3. **输入输出处理** ```python # Python示例:多组输入读取 import sys for line in sys.stdin: n = int(line.strip()) data = list(map(int, sys.stdin.readline().split())) ``` #### 三、备考建议 1. **基础巩固**(第1个月) - 熟练掌握至少一种编程语言的STL库(推荐C++STL或Python的collections) - 每日完成3-5道基础算法题(如LeetCode简单难度) 2. **真题训练**(第2-3个月) - 重点研究**历年真题**(2014-2024年) - 建立错题本,分析时间/空间复杂度优化方法 3. **时间管理** ```text | 题目难度 | 建议耗时 | |----------|----------| | 第1题 | ≤30分钟 | | 第2题 | ≤45分钟 | | 第3题 | ≤60分钟 | | 第4-5题 | ≤90分钟 | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值