hdu 4740【模拟+深搜】.cpp
题意:
给出老虎的起始点、方向和驴的起始点、方向..
规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转..
当转了一次还没路走就会停下来..
问他们有没有可能在某一格相遇..
思路:
模拟,深搜..
用类似时间戳的东西给方格标记上,表示某一秒正好走到该方格..
最后遍历一下驴在某一格方格标记时间是否和老虎在该格标记的时间一样,一样代表正好做过这里了..
还有一种情况就是老虎或驴一直停在那里,那就算不相等,也是可以的..
Tips:
我一直忘了老虎或驴停下来的情况,这样只要该方格正好是时间戳最后一秒,而且另一个动物走过的时间比停下来那一个动物的最后一秒大就表示一个停下来后和另一个相遇了..
我的方法是两个dfs分别记录下老虎和驴走过的每一秒所到位置..
而网上更快的方法是用一个dfs,计算该秒老虎和驴走到的位置,如果正好相等就相遇了..
这样的话就不必遍历完整个路程,所以时间复杂度比我的低~~~~
Code:
/******************************************
*Author: Griselda
*Created Time: 2013-12-10 22:57
*Filename: 4740.cpp
* ****************************************/
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = ;
const int INF = 0x1f1f1f1f; int visd[MAXN][MAXN], vist[MAXN][MAXN];
int n, t, d; bool check(int x, int y) {
return x >= && x < n && y >= && y < n;
} void dfsd(int x, int y, int c)
{
if (!check(x, y) || visd[x][y] != -) return;
visd[x][y] = d++;
if (c == ) {
int i;
for (i = y+; i < n; ++i)
if (visd[x][i] == -) {
visd[x][i] = d++;
} else {
dfsd(x+, i-, );
break;
}
if (i == n) dfsd(x+, n-, );
} else if (c == ) {
int i;
for (i = x+; i < n; ++i)
if (visd[i][y] == -) visd[i][y] = d++;
else {
dfsd(i-, y-, );
break;
}
if (i == n) dfsd(n-, y-, );
} else if (c == ) {
int i;
for (i = y-; i >= ; --i)
if (visd[x][i] == -) visd[x][i] = d++;
else {
dfsd(x-, i+, );
break;
}
if (i == -) dfsd(x-, , );
} else {
int i;
for (i = x-; i >= ; --i)
if (visd[i][y] == -) visd[i][y] = d++;
else {
dfsd(i+, y+, );
break;
}
if (i == -) dfsd(, y+, );
}
} void dfst(int x, int y, int c)
{
if (!check(x, y) || vist[x][y] != -) return;
vist[x][y] = t++;
if (c == ) {
int i;
for (i = y+; i < n; ++i)
if (vist[x][i] == -) {
vist[x][i] = t++;
} else {
dfst(x-, i-, );
break;
}
if (i == n) dfst(x-, n-, );
} else if (c == ) {
int i;
for (i = x+; i < n; ++i)
if (vist[i][y] == -) vist[i][y] = t++;
else {
dfst(i-, y+, );
break;
}
if (i == n) dfst(n-, y+, );
} else if (c == ) {
int i;
for (i = y-; i >= ; --i)
if (vist[x][i] == -) vist[x][i] = t++;
else {
dfst(x+, i+, );
break;
}
if (i == -) dfst(x+, , );
} else {
int i;
for (i = x-; i >= ; --i)
if (vist[i][y] == -) vist[i][y] = t++;
else {
dfst(i+, y-, );
break;
}
if (i == -) dfst(, y-, );
}
} int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out1.txt", "w", stdout);
int a, b, c, x, y, z;
int ans, ansx, ansy;
while (~scanf("%d", &n)) {
if (n == ) break;
ans = INF;
memset(visd, 0xff, sizeof(visd));
memset(vist, 0xff, sizeof(vist));
t = d = ;
scanf("%d %d %d", &a, &b, &c);
scanf("%d %d %d", &x, &y, &z);
dfsd(a, b, c);
dfst(x, y, z);
/*
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
printf("%3d%c", visd[i][j], j == n-1?'\n':' ');
puts("**********************");
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
printf("%3d%c", vist[i][j], j == n-1?'\n':' ');
*/ for (int i = ; i < n; ++i)
for (int j = ; j < n; ++j)
if ((vist[i][j] == visd[i][j] && ans > vist[i][j] && vist[i][j] != -) ||
(vist[i][j] == t- && visd[i][j] > t- ) ||
(visd[i][j] == d- && vist[i][j] > d-)) {
ansx = i, ansy = j;
ans = vist[i][j];
}
if (ans == INF) puts("-1");
else printf("%d %d\n", ansx, ansy);
}
return ;
}
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4740
hdu 4740【模拟+深搜】.cpp的更多相关文章
- HDOJ/HDU 1015 Safecracker(深搜)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
- hdu 1518 Square 深搜,,,,花样剪枝啊!!!
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Block Breaker HDU - 6699(深搜,水,写下涨涨记性)
Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...
- HDU 2614 Beat 深搜DFS
这道题目还是比较水的,但是题意理解确实费了半天劲,没办法 谁让自己是英渣呢! 题目大意: 猪脚要解决问题, 他有个习惯,每次只解决比之前解决过的问题的难度要大. 他给我们一个矩阵 矩阵的 i 行 j ...
- HDU 4740 模拟题意
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711743 题意:驴和老虎在方格中跑,跑的方式:径直跑,若遇到边界或之前走过的 ...
- HDU 6264 (深搜,数论)
题目链接 题意 求\(\sum_{d|n}\phi (d) \times {n\over d}\),其中\(\phi(n) = n\prod_{p|n}({1-{1\over p}})\) 分析 将\ ...
- 深搜基础题目 杭电 HDU 1241
HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...
- HDU 2266 How Many Equations Can You Find(模拟,深搜)
题目 这是传说中的深搜吗....不确定,,,,貌似更加像是模拟,,,, //我要做深搜题目拉 //实际上还是模拟 #include<iostream> #include<string ...
- HDU 4597 Play Game(记忆化搜索,深搜)
题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...
随机推荐
- window.name 跨域
跨域的由来 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但是我们常常会遇到无法避免跨域的情况,如普通文章站点(article.xxx.com)需要评论,而评论站点却在chea ...
- perl lwp编码
$var= $response->content; $var= $response->decoded_content;
- [置顶] gis海量资源网盘提供VIP账号无广告高速下载 (更新更多资源)
资源网盘下载地址:http://laoheitan.bego.cc/ 城通网盘 vip帐号共享 省去 烦人的 广告 多任务同时下载 独乐乐 不如众乐乐 好人 勿改密码. 获取到 vip下载连接后 请 ...
- servlet后台怎样接收对象參数
主要思想是用js把对象转换成json.然后把json提交到后台去,后台把这个json字符串转换成map对象 <script type="text/javascript"> ...
- POJ 3481 & HDU 1908 Double Queue (map运用)
题目链接: PKU:http://poj.org/problem?id=3481 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1908 Descript ...
- /etc/security/limits.conf 设置
jrhdpt01:/root# cat /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 * soft npro ...
- 别动我的奶酪:CSV文件数据丢零现象及对策
CSV文件在读入EXCEL时,对于前面有零的数据项,比如电话号码,会自作聪明地丢掉那个零. 比如,我有一个北京客户,其号码为01059178888,如果这是通过CSV文件来的数据,在EXCEL中打开时 ...
- Swift - 将String类型的数字转换成数字类型
Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...
- 积累的VC编程小技巧之工具条和状态条
1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ...
- Android菜鸟的成长笔记(4)——你真的理解了吗?
原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...