/*
剪枝:四秒后状态会变得和原来一样,所以四秒后如果再经过这个点肯定不是最优的舍去
易错点:在一个是从.到.这两个点都没有被照到并且不是摄像机,也可能需要等3秒,因为后面的结果可能再这三秒中发生改变,要单独判断
*/
#include<stdio.h>
#include<queue>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 510
char s[N][N];
struct node {
int x,y,time;
friend bool operator<(node a,node b) {//优先队列
return a.time>b.time;//从小到大出队
}
}ss,tt,next,cu;
int ma[N][N][4],n;
int judge(int x,int y) {
if(x>=1&&x<=n&&y>=1&&y<=n)
return 1;
return 0;
}
void update(int i,int j,char ch) {//存关于时间的状态
if(ch=='N') {
if(judge(i-1,j))ma[i-1][j][0]=1;
if(judge(i,j+1))ma[i][j+1][1]=1;
if(judge(i+1,j))ma[i+1][j][2]=1;
if(judge(i,j-1))ma[i][j-1][3]=1;
}
if(ch=='W') {
if(judge(i,j-1))ma[i][j-1][0]=1;
if(judge(i-1,j))ma[i-1][j][1]=1;
if(judge(i,j+1))ma[i][j+1][2]=1;
if(judge(i+1,j))ma[i+1][j][3]=1;
}
if(ch=='S') {
if(judge(i+1,j))ma[i+1][j][0]=1;
if(judge(i,j-1))ma[i][j-1][1]=1;
if(judge(i-1,j))ma[i-1][j][2]=1;
if(judge(i,j+1))ma[i][j+1][3]=1;
}
if(ch=='E') {
if(judge(i,j+1))ma[i][j+1][0]=1;
if(judge(i+1,j))ma[i+1][j][1]=1;
if(judge(i,j-1))ma[i][j-1][2]=1;
if(judge(i-1,j))ma[i-1][j][3]=1;
}
}
int dis[4][2]={1,0,-1,0,0,1,0,-1},vis[N][N][5];
int bfs() {
int i,xx,yy;
priority_queue<node>q;
memset(vis,0,sizeof(vis));
ss.time=0;
q.push(ss);
while(!q.empty()) {
ss=q.top();
q.pop();
if(ss.x==tt.x&&ss.y==tt.y)return ss.time;
//if(ss.time>=800000)break
cu=ss;cu.time++;//考虑不够完善,刚开始写的时候写到了for循环里面,这是不对的,因为。到。 等不超过四秒可能会有不同结果。
if(vis[cu.x][cu.y][cu.time%4]==0) {//等待,最多不超过三秒
vis[cu.x][cu.y][cu.time%4]=1;
q.push(cu);
};
for(i=0;i<4;i++) {
next.x=xx=ss.x+dis[i][0];
next.y=yy=ss.y+dis[i][1];
if(judge(xx,yy)&&s[xx][yy]!='#') {
// printf("%d %d\n",xx,yy);
if(s[ss.x][ss.y]!='.'||ma[ss.x][ss.y][ss.time%4]||ma[xx][yy][ss.time%4]||s[xx][yy]!='.') {//如果当前点或者下一个点被照到,或者当前点和下一个点都是摄像机,那么移动的话需要时间+3
next.time=ss.time+3;
if(vis[next.x][next.y][next.time%4]==0) {
vis[next.x][next.y][next.time%4]=1;
q.push(next);
}
continue;
}
next.time=ss.time+1;
if(vis[xx][yy][next.time%4]==0) {//如果是.到.的话也可以不等待
vis[xx][yy][next.time%4]=1;
q.push(next);
}
}
}
}
return -1;
}
int main() {
int i,j,t,f=0;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
memset(ma,0,sizeof(ma));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
if(s[i][j]=='M') {
s[i][j]='.';
ss.x=i;
ss.y=j;
}
else
if(s[i][j]=='T') {
s[i][j]='.';
tt.x=i;
tt.y=j;
}
else
if(s[i][j]!='.')
update(i,j,s[i][j]);
}
printf("Case #%d: %d\n",++f,bfs());
}
return 0;
}

hdu 5040bfs+优先队列 需要存状态的更多相关文章

  1. ASP.NET状态管理之四(暂存状态HttpContext.Items)

    ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items 暂存状态就是利用HttpContext.Items属性来存放数据 MSDN中Http ...

  2. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  3. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  4. HDU 3681 Prison Break(状态压缩dp + BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...

  5. HDU 3442 Three Kingdoms(状态压缩 + BFS )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3442 题目大意:三国时期,刘备逃亡.给定一个最大为50*50的地图,刘备在地图中只能往4个方向走. 地 ...

  6. HDU 4628 Pieces(DP + 状态压缩)

    Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...

  7. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  8. hdu 5306 优先队列

    用到优先队列 #include<iostream> #include<string> #include<algorithm> #include<cstdio& ...

  9. HDU 4006 优先队列

    The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Oth ...

随机推荐

  1. [App Store Connect帮助]六、测试 Beta 版本(3.2)管理测试员:邀请外部测试员

    在您上传至少一个构建版本之后,您可以邀请外部测试员(您组织之外的人员)使用“TestFlight Beta 版测试”来测试您的 App.为了使您的构建版本可用于外部测试,请创建一个群组.添加构建版本, ...

  2. python之类的继承及方法讲解分析

    #!/usr/bin/env python#-*- conding:utf-8 -*- # class Person(object):# def __init__(self,name,age):# s ...

  3. Extjs6 经典版 combo下拉框数据的使用及动态传参

    Extjs的下拉框,在点击的时候会请求一次数据,我们可不可以在点击前就请求好数据,让用户体验更好呢?答案当然是肯定的.如果是公用的下拉框还可以传入不同参数请求不同数据. 第一步: 进入页面前首先加载s ...

  4. react key的作用

    react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给react自己用的. 简单来说,react利用key ...

  5. jwt的应用生成token,redis做储存

    解释一下JWT JWT就是一个字符串,经过加密处理与校验处理的字符串,由三个部分组成.基于token的身份验证可以替代传统的cookie+session身份验证方法.三个部分分别如下: header. ...

  6. jQuery——表单应用(2)

    多行文本框应用之高度变化 HTML: <!--表单-多行文本框应用-高度变化--> <!DOCTYPE html> <html> <head> < ...

  7. C. Coin Troubles 有依赖的背包 + 完全背包变形

    http://codeforces.com/problemset/problem/283/C 一开始的时候,看着样例不懂,为什么5 * a1 + a3不行呢?也是17啊 原来是,题目要求硬币数目a3 ...

  8. Visual Studio 生成项目时脚本执行

    项目属性 - 生成事件 项目生成前:预先生成事件命令行: 项目生成后:后期生成事件命令行:例:copy $(ProjectDir)Reference\sms_cfg.ini $(TargetDir) ...

  9. SQL数据库--数据访问

    数据访问: 对应命名空间:System.Data.SqlClient; SqlConnection:连接对象 SqlCommand:命令对象 SqlDataReader:读取器对象 //造连接字符串 ...

  10. .Net MVC 与WebApi ActionFilterAttribute 区别

    首先我们来看下 这两个ActionFilterAttribute 的命名空间区别的: 可以看出mvc 引用的是System.Web.Mvc,webapi 引用的是System.Web.Http.Fil ...