HDU1180+BFS
bfs
思路:三维标记状态 && 处理好 - | 和时刻的关系即可
- /*
- bfs
- 思路:三维标记状态 && 处理好 - | 和时刻的关系即可
- */
- #include<algorithm>
- #include<iostream>
- #include<string.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<math.h>
- #include<queue>
- #include<stack>
- #include<map>
- #include<set>
- using namespace std;
- typedef long long int64;
- //typedef __int64 int64;
- typedef pair<int64,int64> PII;
- #define MP(a,b) make_pair((a),(b))
- const int inf = 0x3f3f3f3f;
- const double pi=acos(-1.0);
- const int dx[]={,-,,};
- const int dy[]={,,,-};
- const double eps = 1e-;
- const int maxm = ;
- const int maxn = ;
- struct Point {
- int x,y,t;
- };
- Point s,e;
- bool vis[ maxn ][ maxn ][ ];
- char mat[ maxn ][ maxn ];
- queue<Point>q;
- int bfs( int n,int m ){
- memset( vis,false,sizeof( vis ) );
- while( !q.empty() )
- q.pop();
- Point cur = s;
- vis[ s.x ][ s.y ][ s.t% ] = true;
- q.push( cur );
- while( !q.empty() ){
- cur = q.front();
- q.pop();
- //printf("\ncur:[%d,%d] t = %d\n",cur.x,cur.y,cur.t);
- if( cur.x==e.x && cur.y==e.y ){
- e.t = min( e.t,cur.t );
- }
- if( cur.t>=e.t ) continue;
- for( int i=;i<;i++ ){
- Point nxt;
- nxt.x = cur.x + dx[ i ];
- nxt.y = cur.y + dy[ i ];
- nxt.t = cur.t + ;
- if( nxt.x<||nxt.x>=n||nxt.y<||nxt.y>=m ) continue;
- if( mat[ nxt.x ][ nxt.y ]=='*' ) continue;
- if( mat[ nxt.x ][ nxt.y ]=='.' ){
- if( vis[ nxt.x ][ nxt.y ][ nxt.t% ]==true ) continue;
- vis[ nxt.x ][ nxt.y ][ nxt.t% ] = true;
- q.push( nxt );
- //printf("0 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);
- continue;
- }//
- nxt.x = cur.x + dx[ i ];
- nxt.y = cur.y + dy[ i ];
- nxt.t = cur.t + ;
- if(( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%== )||( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%== )){
- if( cur.x==nxt.x&&nxt.y>cur.y ) nxt.y = cur.y + ;
- if( cur.x==nxt.x&&nxt.y<cur.y ) nxt.y = cur.y - ;
- if( nxt.x>=&&nxt.x<n&&nxt.y>=&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){
- if( vis[ nxt.x ][ nxt.y ][ nxt.t% ]==false ){
- vis[ nxt.x ][ nxt.y ][ nxt.t% ] = true;
- q.push( nxt );
- //printf("1 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);
- continue;
- }
- }
- }//1 ‘-’ 上下无需等待时间
- nxt.x = cur.x + dx[ i ];
- nxt.y = cur.y + dy[ i ];
- nxt.t = cur.t + ;
- /*恢复nxt很重要*/
- if(( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%== )||( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%== )){
- nxt.t = cur.t + ;
- if( cur.x==nxt.x&&nxt.y>cur.y ) nxt.y = cur.y + ;
- if( cur.x==nxt.x&&nxt.y<cur.y ) nxt.y = cur.y - ;
- if( nxt.x>=&&nxt.x<n&&nxt.y>=&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){
- if( vis[ nxt.x ][ nxt.y ][ nxt.t% ]==false ){
- vis[ nxt.x ][ nxt.y ][ nxt.t% ] = true;
- q.push( nxt );
- //printf("2 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);
- continue;
- }
- }
- }//2 ‘-’ 上下需要等待时间
- nxt.x = cur.x + dx[ i ];
- nxt.y = cur.y + dy[ i ];
- nxt.t = cur.t + ;
- /*恢复nxt很重要*/
- if(( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%== )||( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%== )){
- if( cur.y==nxt.y&&nxt.x>cur.x ) nxt.x = cur.x + ;
- if( cur.y==nxt.y&&nxt.x<cur.x ) nxt.x = cur.x - ;
- if( nxt.x>=&&nxt.x<n&&nxt.y>=&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){
- if( vis[ nxt.x ][ nxt.y ][ nxt.t% ]==false ){
- vis[ nxt.x ][ nxt.y ][ nxt.t% ] = true;
- q.push( nxt );
- //printf("3 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);
- continue;
- }
- }
- }//3 ‘|’ 左右无需等待时间
- nxt.x = cur.x + dx[ i ];
- nxt.y = cur.y + dy[ i ];
- nxt.t = cur.t + ;
- /*恢复nxt很重要*/
- if(( mat[ nxt.x ][ nxt.y ]=='|'&&cur.t%== )||( mat[ nxt.x ][ nxt.y ]=='-'&&cur.t%== )){
- nxt.t = cur.t + ;
- if( cur.y==nxt.y&&nxt.x>cur.x ) nxt.x = cur.x + ;
- if( cur.y==nxt.y&&nxt.x<cur.x ) nxt.x = cur.x - ;
- if( nxt.x>=&&nxt.x<n&&nxt.y>=&&nxt.y<m&&mat[ nxt.x ][ nxt.y ]=='.' ){
- if( vis[ nxt.x ][ nxt.y ][ nxt.t% ]==false ){
- vis[ nxt.x ][ nxt.y ][ nxt.t% ] = true;
- q.push( nxt );
- //printf("4 nxt:[%d,%d] t = %d\n",nxt.x,nxt.y,nxt.t);
- continue;
- }
- }
- }//4 ‘|’ 左右需要等待时间
- }
- }
- return e.t;
- }
- int main(){
- int n,m;
- //freopen( "in.txt","r",stdin );
- while( scanf("%d%d",&n,&m)== ){
- for( int i=;i<n;i++ ){
- scanf("%s",mat[ i ]);
- for( int j=;j<m;j++ ){
- if( mat[ i ][ j ]=='S' ){
- s.x = i;
- s.y = j;
- s.t = ;
- mat[ i ][ j ] = '.';
- }
- else if( mat[ i ][ j ]=='T' ){
- e.x = i;
- e.y = j;
- e.t = inf;
- mat[ i ][ j ] = '.';
- }
- }
- }
- printf("%d\n",bfs( n,m ));
- }
- return ;
- }
HDU1180+BFS的更多相关文章
- 诡异的楼梯(bfs)hdu1180
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...
- HDU1180:诡异的楼梯(bfs+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1180 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里, ...
- hdu1180 优先队列bfs+判断方向
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓
#include<iostream> #include<queue> #include<cstring> using namespace std; int row, ...
- hdu1180 诡异的楼梯 bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1180/ 题目和不同的bfs有个不同的地方就是存在横着的或者竖着的楼梯,楼梯每过一个时刻就改变一次横竖的走向,人可 ...
- BFS的小结
写这类搜索题.首先感觉要有个框架.比如我的框架对于BFS来说(对于DFS,我想有两个一个是递归版一个是栈版).这里是BFS小结.所以介绍一下BFS.我的框架.(也是搜集了网上许多神人的作品.) 1:节 ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
随机推荐
- swift基础知识学习
用let来声明常量,用var来声明变量 声明变量: var x = 0.0, y = 0.0, z = 0.0 var welcomeMessage: String 常量和变量的命名 你可以用任何 ...
- 用css3做标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 函数 swap
1,default swap namespace std { template<typename T> void swap( T& a, T& b) { T temp(a) ...
- fedora下python3 安装tkinter和pygame
root 下用 “yum search tkinter”,如下图所示: 然后再根据系统选择安装就好了. tkinter安装完毕. 接下来是安装pygame在fedora的python3上,我的是pyt ...
- c#汉字转为拼音
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressi ...
- grails的插件
今天来歪理邪说一下grails的插件. 有个问题让本人困惑了一段时间,插件是属于grails的,还是属于某个工程的?为什么会有这个问题呢,这涉及到grails插件的安装方式. grails的插件像是一 ...
- 认识HTML5
引言,认识两个标准制定的组织 在讲什么是Html5之前得先了解两个组织:WHATWG :网页超文本技术工作小组(英语:Web Hypertext Application Technology Work ...
- T-SQL实例 函数结果设置为列别名
本文分享一个T-SQL的例子,将自定义函数的结果作为别名列,是个不错的应用实例,有兴趣的朋友研究下. T-SQL实例,学习下将函数结果作为别名列的方法. 代码: view source print? ...
- C# 返回json结果集,js日期格式化
asp.net mvc返回json结果集 return Json(new { total = totalCount, rows = result }, JsonRequestBehavior.Allo ...
- 《WPF程序设计指南》读书笔记——第7章 Canvas
1.Canvas面板 using System; using System.Windows; using System.Windows.Controls; using System.Windows.M ...