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 ...
- django admin manytomany获取所选字段值
和一般views中前端数据的获取一样. def save_model(self, request, obj, form, change): door_id_list= request. ...
- Swift - 获取屏幕点击坐标下所有对象(SpriteKit游戏开发)
对于场景内对象元件的点击响应,我们可以在场景的touchesBegan()方法中内统一处理. SKScene中touchesBegan()是响应屏幕点击的方法,在这里面我们可以先获取点击位置下所有的对 ...
- Swift - 创建并设置背景(SpriteKit游戏开发)
1,先把背景图片bg.jpg,bg@2x.jpg直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 美化 - DropDownList控件
地址:http://www.baidufe.com/component/dropdownlist/index.html 效果: 引用JS文件: <link href="Js/DropD ...
- shell脚本中怎样同时执行多个.sql文件,并把结果写入文件中(转)
转载:http://joewalker.iteye.com/blog/408879命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名;导出整个数据 ...
- 慎得慌二u赫然共和任务i个屁
http://www.huihui.cn/share/8424421 http://www.huihui.cn/share/8424375 http://www.huihui.cn/share/842 ...
- 求刷Kindle Fire HD的方法
前几天入手了台Amazon Kindle Fire HD 其系统是经过Amazon尝试改造过的Android,用起来很不爽,想刷个CM10之类的,求教程和工具.
- Linux网络基础配置
这是看itercast视频的笔记 Linux网络基础配置 以太网连接 在Linux中,以太网接口被命令为:eth0, eth1等, 0,1代表网卡编号 通过lspci命令可以查看网上硬件信息(如果是u ...
- 人事管理系统 c语言版
int menu(){ printf("请按提示输入完毕操作!\n"); printf("1.查询员工信息\n"); printf("2.统计 ...