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(记忆化搜索,深搜)
题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...
随机推荐
- CSDN高校俱乐部2013年秋季北京地区第一站“编程语言的应用及其发展”—北京联合大学
2013年12月11日晚17:00.CSDN高校俱乐2013年秋季北京地区第一站“编程语言的应用及其发展”在北京联合大学进行. 首先,CSDN总部人员介绍CSDN俱乐部的改版以及线上编程挑战赛.CSD ...
- xcode-build/version-bump
# xcode-build-bump.sh # @desc Auto-increment the build number every time the project is run. # @usag ...
- jquery mobile -role
jquery mobile -role - cc_jony - 博客园 jquery mobile -role data-page 页面 data-header 页面的头部 data-conten ...
- Matlab图像处理系列2———空间域平滑滤波器
注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法 本文章是Matlab图像处理系列的第二篇文章.介绍了空间域图像处理最主要的概念----模版和滤波器,给出了均值滤波起和中值滤波 ...
- Effective C++_笔记_条款11_在operator=中处理“自我赋值”
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果: ...
- 在Java中使用MD5和BASE64
MD5: 在上一篇<Servlet的学习之Session(5)>中,为了能使获取的所有随机数都能有相同的位数,我们采用MD5获取随机数的消息摘要(或称数据指纹.数据摘要等等). MD5可以 ...
- libcurl编程,整整17篇
http://www.cnblogs.com/lidabo/category/639633.html
- Twenty Newsgroups Classification任务之二seq2sparse(2)
接上篇,SequenceFileTokenizerMapper的输出文件在/home/mahout/mahout-work-mahout0/20news-vectors/tokenized-docum ...
- Android 驱动(二) IIC简单介绍
一. I2C简单介绍 I2C(Inter-Integrated Circuit)总线是一种由 Philips 公司开发的两线式串行总线,用于连接微控制器及其外围设备.I2C 总线最基本的长处就是简单性 ...
- RAID的解释(附购买链接)
现在使用RAID6 早期 raid5+1hotspare 小型机有存储备份 就是这么多年没有恢复过~ 金融行业 数据万金 是的 磁盘阵列柜换控制器 型号太老 缓存数据问题 把存储都下线了 ...