课程目录展开/折叠
第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未能获得满意解答的,可以联系陈远龙老师答疑
目录