修改密码

全面备考2025 CSP-J 初赛 & 复赛直播课

更新中

陈远龙老师主讲 & 答疑

课程题单 - T1005

未购买 · 可先试学4节课

课程目录展开/折叠

第4课 CSP-J复赛试题分析精讲

视频时长:01:13:27
播放快捷键

播放/暂停:空格(或鼠标单击)      全屏:F(或鼠标双击)      退出全屏:Esc

快进10 / 30 / 60秒:方向键→ / Ctrl + 方向键→ / Shift + 方向键→

快退10 / 30 / 60秒:方向键← / Ctrl + 方向键← / Shift + 方向键←

本节课讲解配套PPT&板书:

本节课讲解到的源代码

源代码下载:第4课 CSP-J复赛试题分析精讲-源代码下载

1. P1195 - 地图探险【CSP-J 2024 入门级 T2】-1 - bool数组去重
#include <bits/stdc++.h>
using namespace std;

int n, m, k;
int x, y, d;
char mp[1005][1005];
bool f[1005][1005]; // 全局变量 

// 方向数组
// d = 0; d = 1; d = 2; d = 3;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

void solve()
{
    // bool f[1005][1005] = {0};
    memset(f, 0x00, sizeof(f));
    cin >> n >> m >> k;
    cin >> x >> y >> d;
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= m; j ++)
            cin >> mp[i][j];
    }
    f[x][y] = true;
    // int ans = 1; // answer
    // 模拟操作 
    // 走过的坐标需要去重处理 
    while (k--)
    {
        // 即将要走的新的坐标 
        int nx = x + dx[d];
        int ny = y + dy[d];
        // 1. 越界或者是障碍物,原地掉头
        // x: 1 - n y: 1 - m
        // 或者mp[nx][ny] == 'x' 
        if (nx < 1 || nx > n || ny < 1 || ny > m || mp[nx][ny] == 'x') 
        {
            d = (d + 1) % 4;
            continue;
        }
        // 2. 能走就走,方向不变 
        x = nx;
        y = ny;
        f[x][y] = true;
        // cout << x << "," << y << endl;
        // ans ++;
    }

    // 去重 
    int ans = 0; 
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= m; j ++)
        {
            if (f[i][j]) ans ++;
        }
    }
    cout << ans << endl;
}

int main()
{
    // freopen("explore.in", "r", stdin);
    // freopen("explore.out", "w", stdout);
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}
2. P1195 - 地图探险【CSP-J 2024 入门级 T2】-2 - set去重
#include <bits/stdc++.h>
using namespace std;

int n, m, k;
int x, y, d;
char mp[1005][1005];

// 方向数组
// d = 0; d = 1; d = 2; d = 3;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

void solve()
{
    set<string> st;
    cin >> n >> m >> k;
    cin >> x >> y >> d;
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= m; j ++)
            cin >> mp[i][j];
    }
    st.insert(to_string(x) + "-" + to_string(y));
    // int ans = 1; // answer
    // 模拟操作 
    // 走过的坐标需要去重处理 
    while (k--)
    {
        // 即将要走的新的坐标 
        int nx = x + dx[d];
        int ny = y + dy[d];
        // 1. 越界或者是障碍物,原地掉头
        // x: 1 - n y: 1 - m
        // 或者mp[nx][ny] == 'x' 
        if (nx < 1 || nx > n || ny < 1 || ny > m || mp[nx][ny] == 'x') 
        {
            d = (d + 1) % 4;
            continue;
        }
        // 2. 能走就走,方向不变 
        x = nx;
        y = ny;
        st.insert(to_string(x) + "-" + to_string(y));
    }

    cout << st.size() << endl;
}

int main()
{
    // freopen("explore.in", "r", stdin);
    // freopen("explore.out", "w", stdout);
    int T;
    cin >> T;
    while (T--)
    {
        solve();
    }

    return 0;
}

本节课答疑

建议大家有问题先通过AI答疑(比如:DeepSeek 等),AI时代需要学会使用AI辅助学习

陈远龙老师视频讲解:如何使用DeepSeek进行答疑?

通过AI未能获得满意解答的,可以联系陈远龙老师答疑

目录