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的更多相关文章

  1. 诡异的楼梯(bfs)hdu1180

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...

  2. HDU1180:诡异的楼梯(bfs+优先队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1180 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里, ...

  3. hdu1180 优先队列bfs+判断方向

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  4. hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓

    #include<iostream> #include<queue> #include<cstring> using namespace std; int row, ...

  5. hdu1180 诡异的楼梯 bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1180/ 题目和不同的bfs有个不同的地方就是存在横着的或者竖着的楼梯,楼梯每过一个时刻就改变一次横竖的走向,人可 ...

  6. BFS的小结

    写这类搜索题.首先感觉要有个框架.比如我的框架对于BFS来说(对于DFS,我想有两个一个是递归版一个是栈版).这里是BFS小结.所以介绍一下BFS.我的框架.(也是搜集了网上许多神人的作品.) 1:节 ...

  7. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  8. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  9. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

随机推荐

  1. 有趣的hello word

    程序一 #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #def ...

  2. SQL通过日期计算年龄

    首先建立一个表如下: ======================= BirthDay datetime not null Age 通过公式计算得出 ======================= 以 ...

  3. Bitmap、CBitmap、HBITMAP以及BITMAP的相互转换

    Bitmap.CBitmap.HBITMAP以及BITMAP的相互转换 构建CBitmapCBitmap bmp;bmp.LoadBitmap(ID); 构建HBITMAPHBitmap = (HBI ...

  4. linux同步

    1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...

  5. dom4j api 详解--XPath 节点详解

    dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...

  6. 没有文件扩展".js"的脚本引擎 解决办法

    在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULT ...

  7. CCNP第四天 OSPF综合实验(1)

    ospf综合实验(1) 本实验主要考察ospf中的接口上的多种工作方式 实验如图所示: 所用拓扑为CCNP标准版,如图: --------------------------------------- ...

  8. (转载)SQL语句,纵列转横列

    SQL语句,纵列转横列 Feed: 大富翁笔记 Title: SQL语句,纵列转横列 Author: wzmbox Comments sTable.db库位 货物编号 库存数1 0101 501 01 ...

  9. SQL Server— 存在检测、建库、 建表、约束、外键、级联删除

    /******************************************************************************** *主题: SQL Server- 存 ...

  10. 虚拟机安装Centos6.5之后的网络配置

    我使用的是minimal模式安装的,默认是无法联网的,需要自己配置,下面我列举2种联网的配置方法 方法1: 默认使用的是NAT模式,修改/etc/sysconfig/network-scripts/i ...