文章目录

  • 题目解答
  • 题目链接

题目解答



来源:acwing

分析:

条件1:可以从起点走到该点。用st1[][]数组表示能否从起点到达该点。

条件2:不可以从该点走到终点。

对于条件2的处理:从终点反向遍历能到达的点,就是所有可以走到终点的点。打上标记,剩下的是满足条件2的点。用st2[][]数组表示能否从终点反向到达该点。

求满足条件1和2的点的数量。

下面是4个方向,用两个数组dx[]dy[]表示。

// 方向dx和dy
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

ac代码
下面对这句代码进行解释:if(check(a,b, i ^ 2)) dfs2(a, b);其中check函数用来检查该点是否可以行走,比如可以上下左右走,可以朝下走等。(a,b)是当前点的坐标,后面的i ^2表示方向,啥方向呢? i表示方向,i ^2表示i的反方向。 这里需要结合上图理解。因为我们的方向是0~3,即i的取值是0 ~ 3。0的反方向是2,1的反方向是3,而i ^2满足什么性质呢? 恰好1和2异或得到3,2和2异或得0,即恰好实现了反方向!!!

#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int n, m;
char g[N][N];
// st1[x][y] = true 表示能从起点到达(x,y)
// st2[x][y] = true 表示 能从终点 反向遍历到(x,y)
bool st1[N][N], st2[N][N];
// 方向dx和dy
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};// 判断当前点(x,y)是否可走
// k 表示方向,用0~3表示
bool check(int x, int y , int k){char c = g[x][y];// 可上下左右四个方向走if(c == '+' || c == 'S' || c == 'T') return true;// 只能左右走,k为1或者3,即奇数if(c == '-' && k %2 == 1) return true;// 只能上下走,k为0或2,即偶数if(c == '|' && k % 2 == 0) return true;// 只能往下走,k为2if( c == '.' && k == 2)  return true;// 其他情况都是不能走return false;
}
//从起点开始遍历
void dfs1(int x, int y){st1[x][y] = true; //从起点开始能遍历到的点,标记为truefor(int i = 0; i< 4; i++){int a = x + dx[i], b = y + dy[i];if(a < 0 ||  a >= n || b<0 || b>=m || g[a][b] == '#') continue;if(st1[a][b]) continue;if(check(x, y, i)) dfs1(a, b);}
}
//从终点开始遍历
void dfs2(int x, int y){st2[x][y] = true;for(int i =0; i< 4; i++){int a = x  + dx[i], b= y + dy[i];if(a < 0 || a >= n || b < 0 || b>=m || g[a][b] =='#') continue;if(st2[a][b]) continue;//反向遍历,方向是反的,i 异或2 就表示反方向if(check(a,b, i ^ 2)) dfs2(a, b);}
}int main(){cin >> n >> m;for(int i = 0; i< n; i++)for(int j = 0; j<m; j++) cin >> g[i][j];int tx, ty;// 保存终点坐标,目的:是否输出stuckfor(int i = 0; i< n; i++)for(int j = 0; j< m; j++){//如果是起点,开始第一次遍历if(g[i][j] == 'S') dfs1(i,j);else if(g[i][j] == 'T'){tx = i ,ty = j;dfs2(i, j); // 从终点开始反向遍历}}// 如果从起点无法到达终点,则输出stuckif(!st1[tx][ty])  puts("I'm stuck!");else{int res = 0;for(int i = 0;  i< n; i++)for(int j = 0; j< m; j++){if(st1[i][j] &&  !st2[i][j])res ++;}cout << res << endl;}}

题目链接

https://www.acwing.com/problem/content/3199/

CSP认证201312-5 I’m stuck![C++题解]:dfs、两次dfs相关推荐

  1. CCF CSP认证——201312

    文章目录 201312-1 出现次数最多的数 201312-2 ISBN号码 201312-3 最大的矩形 201312-4 有趣的数 201312-5 I'm stuck!    201312-1 ...

  2. CSP认证201409-4 最优配餐[C++题解]:bfs、多源bfs、最短路、图论

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 有很多起点S,同时有很多终点T,求每个终点到起点中最短的路,只要是到达其中一个起点就行.所以这是一个多源bfs的题目. ac代码 # ...

  3. CSP认证近两期试题汇总

    前言 因为了学分的需要,准备参加CSP认证,结果发现这个比赛没有题解,平台也没有提供相关讨论方式,因此决定以此来记录本人刷题解答.希望能够帮到大家,共同进步. 本人主要使用python刷题,但是pyt ...

  4. 谈一下两次CSP认证从180分到380分的感想

    最近联系我的小可爱们比较多,我用qq建了一个ccf csp考试交流群,群号673612216,如果感觉有用可以加一下哦~~ 欢迎访问我的CCF认证考试题解目录哦 https://blog.csdn.n ...

  5. CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版

    CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.Scanner;public class Mai ...

  6. CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版

    CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util. ...

  7. CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版

    CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...

  8. CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版

    CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util.S ...

  9. CSP认证201509-2 日期计算[C++题解]:枚举、模拟

    题目分析 来源:acwing 分析: 主要是判断2月多少天.然后就是遍历每个月,依次减去当前月的天数,发现days还剩多少天就是当月几号. 其实这里是背的模板,日期题模板更难一点的题目是 CSP认证 ...

  10. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系

    原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会      发布时间:2017-01-20 16:16 作者:陆建峰    余立功 摘要:为提升计算机专业类学生 ...

最新文章

  1. 丢掉虚拟机,在裸机上使用 Kubernetes 六大优势!
  2. 每日一皮:地铁上打瞌睡的程序员...
  3. (chap1 web网络基础) HTTP协议相关的各个协议(2)
  4. java 后端校验_如何实现Java后端数据校验?看这篇就足够!
  5. 微信中禁止网页下拉出现网页由XXX提供 【亲测有效】
  6. scala教程之:可见性规则
  7. API标准化成为技术团队面临的最大挑战
  8. Opencv基础画图函数——line、circle、rectangle、Rect、ellipse、polylines、putText函数的用法
  9. 如何把通达信公式变成python_通达信附图如何改成选股公式?
  10. yarn-cli 缓存(转)
  11. 【C++】使用setprecision控制输出流显示浮点数的有效数字个数
  12. GridSearchCV( )参数详情
  13. java发送带附件的邮件_Java发送邮件(带附件)
  14. 大数据和人工智能未来发展趋势
  15. JAVA常用工具类-【6】邮箱发送
  16. SpringBoot知识点整理
  17. 基于ssm外卖点餐系统源码
  18. [海森推荐]人工智能-人工智能好书推荐
  19. 混合计算题300道_混合这道美丽人生鸡尾酒配方
  20. 东芝21vf6c_东芝开发21寸高清裸眼3D立体液晶屏

热门文章

  1. PAT刷题 (Java语言)
  2. pat1003 迪杰斯特拉法和dfs求最短路
  3. WTL 出现的SetMsgHandled和IsMsgHandled 错误
  4. SQLite入门与分析(四)---Page Cache之事务处理(3)
  5. html属性选择器怎么写,html – 具有“type”属性与make-up属性的CSS属性选择器和区分大小写...
  6. r语言提取列名_R语言基础(2)向量|矩阵|数组|数据框|数据IO|实用函数
  7. 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(4)
  8. 【数理知识】《积分变换与场论》王振老师-第4章-矢量分析
  9. android lcd调试 高通平台lcd调试深入分析总结(mipi和rgb接口)
  10. Linux frame buffer 编程 -- fb基本操作