题意:链接

分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状态的值,那么这个数值对应的状态就有四种,BFS搜索即可。之前没有考虑到折回这种情况,原因就是状态没有进行完全的搜索。后面看了网上的写法中多是直接开设了四维的一个状态,只需记录某状态走还是没走,也就没有这种折回的考虑了。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std; const int N = ;
int n, m, t;
int sx, sy, dx, dy, ex, ey;
char mp[N][N];
int score[N][N];
int dir[][] = {, , , -, , , -, }; struct Node {
int x, y, val, ti;
Node() {}
Node(int _x, int _y, int _val, int _ti) : x(_x), y(_y), val(_val), ti(_ti) {}
}; inline bool judge(int x, int y) {
if (x < || x > n || y < || y > m) return false;
else return true;
} inline int cal(int x) {
int a = (int)(bool(x/));
int b = (int)(bool(x%));
if (a && b) return ;
else if (a) return ;
else if (b) return ;
else return ;
} int lol[N][N]; int solve() {
memset(lol, 0xff, sizeof (lol));
queue<Node>q;
q.push(Node(sx, sy, score[sx][sy], t));
lol[sx][sy] = cal(score[sx][sy]);
while (!q.empty()) {
Node tmp = q.front();
q.pop();
if (lol[tmp.x][tmp.y] == ) return t - tmp.ti;
if (tmp.ti > ) { // 如果还有剩余时间
for (int k = ; k < ; ++k) {
int cx = tmp.x + dir[k][], cy = tmp.y + dir[k][];
int cc = cal(tmp.val + score[cx][cy]);
if (judge(cx, cy) && cc != lol[cx][cy] && mp[cx][cy] == '.') {
lol[cx][cy] = cc;
if (lol[cx][cy] == ) return t-(tmp.ti-);
q.push(Node(cx, cy, tmp.val+score[cx][cy], tmp.ti-));
}
}
}
}
return -;
} int main() {
int T, ca = ;
scanf("%d", &T);
while (T--) {
int cx, cy;
scanf("%d %d %d", &n, &m, &t);
memset(score, , sizeof (score));
for (int i = ; i <= n; ++i) {
scanf("%s", mp[i]+);
for (int j = ; j <= m; ++j) {
if (mp[i][j] == 'S') {
sx = i, sy = j;
mp[i][j] = '.';
} else if (mp[i][j] == 'D') {
dx = i, dy = j;
} else if (mp[i][j] == 'E') {
ex = i, ey = j;
}
}
}
for (int k = ; k < ; ++k) { // 把分数都加到格子上
cx = dx + dir[k][], cy = dy + dir[k][];
while (judge(cx, cy) && mp[cx][cy] == '.') {
score[cx][cy] += ;
cx += dir[k][], cy += dir[k][];
}
cx = ex + dir[k][], cy = ey + dir[k][];
while (judge(cx, cy) && mp[cx][cy] == '.') {
score[cx][cy] += ;
cx += dir[k][], cy += dir[k][];
}
}
printf("Case %d:\n%d\n", ++ca, solve());
}
return ;
}

HDU-4528 小明系列故事——捉迷藏 BFS模拟的更多相关文章

  1. HDU 4528 小明系列故事――捉迷藏

    广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...

  2. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  3. HDU 4528 BFS 小明系列故事——捉迷藏

    原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...

  4. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  5. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

  7. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. hdu 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

随机推荐

  1. JMeter之JDBC接口测试

    使用jmeter连接数据库后,即可在jmeter中构造对数据库进行增删改查的请求以对数据库进行测试,以下以mysql数据库为例,演示jmeter连接mysql并进程查询操作的步骤. 1.确保mysql ...

  2. Json与类对象转换

    Json在js,jquery中可以直接使用,比如下串: { "from":"en" ,"to":"zh" ," ...

  3. LinqToXml

    简单的创建一个Xml ///创建一个Xml文档 XElement x = new XElement("qiao");//创建一个根节点 var xx = new XElement( ...

  4. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

  5. Android-开发工具

    jdk 当前版本  jdk-6u43-windows-x64 安装完成后,配置环境变量JAVA_HOME.Path adt-bundle  当前版本 adt-bundle-windows-x86_64 ...

  6. 大商创开通用户和店铺 sql追踪

    添加用户(账号:wmy123 ,密码:wzd222,id:69)INSERT INTO `dsc1`.`dsc_users` (user_name,mobile_phone,email,passwor ...

  7. linux环境下配置java WEB项目运行环境,jdk8+tomcat8+mysql5.7.11 新手向

    一:安装jdk 1.下载jdk  在oracle下载东西的时候因为oracle的一些验证机制,所以需要在链接前面添加一些参数 wget --no-check-certificate --no-cook ...

  8. TCP协议下大数据传输IOCP乱序问题

    毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...

  9. struts1

    1.简单应用示例 导入struts1的jar包,然后配置xml,写java和jsp /struts/WebRoot/Login.jsp <%@ page language="java& ...

  10. 解决ADB端口占用问题

    方式一5037为adb默认端口,若5037端口被占用,查看占用端口的进程PIDC:\Users\wwx229495>netstat -aon|findstr 5037   TCP    127. ...