E

题意:
就是给你一个矩阵,有的能走有的不行,现在问你从起点走到终点的最少次数。每次可以往四个角走,可以走任意距离。

思考:
一看能走任意距离就是洪流的那道题,但是刚开始我想傻逼了,在想中间如果有#怎么判,其实第一次遇到#就可以break了。然后我就写了,我想着走的方向都是不一样的,反正能进来就进来就行了,然后第一次遇到终点就return距离,就错了。因为我用的是一次一次走的,不是枚举多少,所以queue里面不满足单调性了,如果用洪流的话,第一次进来的肯定是最好的,所以同方向的时候不会被更新第二次。但是我习惯写那种distra类型的搜索,所以是贪心或者dp去迭代更新。总之呢,标准的bfs就是每次把能拿到的全部放进来保证队列的单调性,distra呢就是拿进来的会多次迭代更新。并且值得注意的是,明显知道不同的方向会影响答案,所以dist一般都要多维护一维啊,就和维护血量一样,不知道当时比赛的时候想的啥…

代码:

distra做法:struct node{int x,y;int dis;int op;bool operator<(const node&A)const{return A.dis<dis;}
};int T,n,m,k;
int stx,sty,edx,edy;
char va[M][M];
int dist[5][M][M];
int dx[4] = {1,1,-1,-1};
int dy[4] = {1,-1,1,-1};
int dir[4] = {1,2,3,4};void bfs()
{   for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=4;k++)dist[k][i][j] = inf;}}priority_queue<node> q;q.push(node{stx,sty,0,0}); //放进来for(int i=1;i<=4;i++) dist[i][stx][sty] = 0;while(q.size()){auto now = q.top();q.pop();int x = now.x,y = now.y,dis = now.dis,op = now.op;if(dis>dist[op][x][y]) continue; //这样去更新就没有意义了for(int i=0;i<4;i++){int xx = x+dx[i],yy = y+dy[i];if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&va[xx][yy]=='.'){int nowdis = dis+(op!=dir[i]);if(nowdis<dist[dir[i]][xx][yy]){dist[dir[i]][xx][yy] = nowdis;q.push(node{xx,yy,nowdis,dir[i]});}}}}
}signed main()
{IOS;cin>>n;cin>>stx>>sty>>edx>>edy;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cin>>va[i][j];}bfs();int minn = inf;for(int i=1;i<=4;i++) minn = min(minn,dist[i][edx][edy]); //终点的所有方向里取个最小值if(minn==inf) cout<<-1;else cout<<minn;return 0;
}标准bfs:int T,n,m,k;
int stx,sty,edx,edy;
char va[M][M];
int dist[M][M];
int vis[4][M][M];
int dx[4] = {1,1,-1,-1};
int dy[4] = {1,-1,1,-1};void bfs()
{for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dist[i][j] = inf;queue<PII> q;q.push({stx,sty});dist[stx][sty] = 0;while(q.size()){auto now = q.front();q.pop();int x = now.fi,y = now.se;for(int i=0;i<4;i++){for(int j=1;;j++){int xx = x+j*dx[i],yy = y+j*dy[i];if(xx<1||xx>n||yy<1||yy>n||va[xx][yy]=='#') break;if(vis[i][xx][yy]) break; //如果这个方向走过了就不看了,vis也就是多加一维罢了vis[i][xx][yy] = 1;dist[xx][yy] = min(dist[xx][yy],dist[x][y]+1);q.push({xx,yy});}}}
}signed main()
{IOS;cin>>n;cin>>stx>>sty>>edx>>edy;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cin>>va[i][j];}bfs();if(dist[edx][edy]==inf) cout<<-1;else cout<<dist[edx][edy];return 0;
}

总结:
多多思考。

ABC-Bishop2-(bfs和distra的区别)相关推荐

  1. C语言设计A与B的区别,C语言辅导 - abc与a=b=c的区别 and something else

    这段时间一直在给豪神妹妹辅导C语言,从最简单的什么是C语言讲起,到现在讲到了选择判断条件,一星期有余,今天在讲解题目的时候,发现了一些我们经常忽视的问题,今天简单总结一下. 1.判断char型变量ch ...

  2. AOJ 558 Cheese(bfs)

    题意:网格图,老鼠吃奶酪,吃完奶酪体力值会增加,只能吃硬度不大于体力值的,问最小步数. 思路:按硬度从小到大的吃起,依次求最短路. 我用曼哈顿距离估价的A*,和普通bfs的time没区别啊,还把优先级 ...

  3. java中_null和“”的区别详解

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  4. java null和 的区别_java中null和的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  5. java中的“”和null的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception    Strin ...

  6. PTA L3-008 喊山 (BFS)

    L3-008 喊山 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的" ...

  7. java中null与_java中NULL与 的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  8. 队列、栈、BFS、DFS

    队列.栈.BFS.DFS 队列 循环队列 BFS-广度优先搜索 节点的处理顺序 队列的入队和出队顺序 栈 DFS-深度优先搜索 节点的处理顺序 栈的入栈出栈顺序 DFS 和 BFS的区别 队列 在 F ...

  9. java和js两种语言的区别小结

    数据类型的区别 1.js有五种基本数据类型(值类型):Number.String.Boolean.Null.Undefined.Symbol. 三种引用数据类型:Array.Object.Functi ...

最新文章

  1. 微信小程序发送模板消息,php发送模板消息
  2. CVPR 2021 | MI-AOD: 少量样本实现高检测性能
  3. 呆呆键盘手11.14号学到的定位-实现滚动门效果
  4. android录制视频横向,Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)...
  5. sequelize 连接2个数据库_数据库激荡 40 年,NoSQL、NewSQL谁能接棒?
  6. 计算机考研考编程,计算机考研面试------编程语言
  7. Hadoop报错AccessControlException: Permission denied: user=vincent, access=WRITE, inode=/:iie4bu:supe
  8. Java实现最电话号码的简单加密源码
  9. Gridview SummaryItem 格式化数字
  10. 2013腾讯编程马拉松初赛(3月20日)
  11. GroupCoordinator分析
  12. 同为EA888发动机,迈腾和奥迪A4L,为何差价10万多?
  13. win11虚拟内存怎么修改 Windows11修改虚拟内存的步骤方法
  14. 真假签到题(签到+打表)
  15. Mysql DBA 高级运维学习之路-DML语句之insert知识讲解
  16. php丢色子,jQuery+PHP实现的掷色子抽奖游戏实例_PHP
  17. 编译原理实验二:词法分析程序
  18. 【bzoj3144 切糕】
  19. 跟着团子学SAP PS—项目结算规则的自动生成 CJB2/CJB1 (ETO模式下正确结算规则设定案例)
  20. vs2010环境下提示找不到d3dx9.h,及其“dxerr.lib”。

热门文章

  1. java线程池(八):ForkJoinPool源码分析之四(ForkJoinWorkerThread源码)
  2. 以quot;小刀会“的成败论当今创业成败
  3. Scala语言--简介
  4. excel批量导入规则验证
  5. 5G技术带来无限可能,VR全景视频前景怎么样?
  6. vba 选中所有区域 但是不包括首行
  7. 一阶RC滤波器,数字滤波器
  8. 2020女生适合学什么设计
  9. 【图文教程】MacOS 下载/安装 我的世界 Minecraft + 宝可梦 Pixelmon Modpack
  10. 猪脸识别正式开赛!杨强、车品觉实力助阵,关于刘强东举办的这场大赛,你需要知道更多