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(记忆化搜索,深搜)
题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...
随机推荐
- linux命令:Linux命令大全
Linux命令大全 http://man.linuxde.net/
- UpdateWindow API函数的作用很明显
待续 摘自<Delphi深度历险>
- io 测试
//其中能够实现编码的只有OutputStreamWriter和对应inputStreamReader package net; import java.io.BufferedWriter; impo ...
- [置顶] window.open()你真的会了吗?
一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,name, ...
- iot 表 主键索引叶子块包含了表所有数据
<pre name="code" class="html">iot表测试: 在create table语句后面使用organization inde ...
- openCV中cvSnakeImage()函数代码分析
/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMP ...
- ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏
本篇讲解三个工具栏控件.其中Ext.toolbar.Toolbar可以用来放置一些工具类操控按钮和菜单,Ext.toolbar.Paging专门用来控制数据集的分页展示,Ext.ux.statusba ...
- Android颜色转换工具类ColorUtil
项目中需要根据ScrollView的滚动距离来动态设置Topbar的背景透明度,网上有类似的开源库FadingActionBar,使用的是ActionBar做的.而我的项目中并没有使用ActionBa ...
- CPU 球迷助威清理灰尘图形的全过程
主机因为使用时间长的电源风扇,风扇轴承石油枯竭,导致拒绝或不转的风扇转速,热量使电源不能得到有效排除,往往会造成电脑死机,有几种方法来解决. 单省钱的办法例如以下: 1.把电源从主机上拆下,例如以下图 ...
- Visual Studio Code中文文档
Visual Studio Code中文文档 Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行. ...