博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2013 ACM/ICPC 杭州网络赛C题
阅读量:6412 次
发布时间:2019-06-23

本文共 2418 字,大约阅读时间需要 8 分钟。

题意:驴和老虎,在一个矩阵的两个格子里,有各自的起始方向。两者以相同的速度向前移动,前方不能走时驴总是向右,老虎总是向左。他们不能超出矩阵边界也不能走自己走过的格子(但可以走对方走过的格子)。如果不能前进时转向后仍不能前进则永久停止运动,问两者是否相遇(同时出现在同一个格子里,同时出现在格子的边界上不算),若相遇给出相遇坐标。

分析:模拟即可,每次将两者按其规则移动,并判断两者是否在同一个格子里。注意:起始点在同一个格子里也算相遇。转向不算时间,因为题里说二者速度始终相同。本来应该用面向对象的方式,但是比赛时不敢轻举妄动……

#include 
#include
using namespace std;#define MAX_Y 1005#define MAX_X MAX_Ystruct Point{ int x, y; Point() {} Point(int x, int y):x(x), y(y) {} bool operator == (const Point &a) const { return a.x == x && a.y == y; } Point operator + (const Point &a) { return Point(x + a.x, y + a.y); }};Point dir[4] = {Point(0, 1), Point(1, 0), Point(0, -1), Point(-1, 0)};bool donkey_vis[MAX_X][MAX_Y];bool tiger_vis[MAX_X][MAX_Y];int tiger_dir;int donkey_dir;int grid_size;Point tiger, donkey;bool tiger_stop, donkey_stop;void visit(Point a, bool vis[][MAX_X]){ vis[a.x][a.y] = true;}void input(Point &a, int &dir){ int x, y; scanf("%d%d%d", &x, &y, &dir); a.x = x; a.y = y;}bool ok(Point a, bool vis[][MAX_Y]){ if (a.x < 0 || a.x >= grid_size || a.y < 0 || a.y >= grid_size) return false; return !vis[a.x][a.y];}void move(Point &animal, int &cur_dir, bool vis[][MAX_Y], bool &stop, int dir_delta){ if (stop) return; Point des = animal + dir[cur_dir]; if (ok(des, vis)) { animal = des; visit(des, vis); return; } cur_dir = (cur_dir + dir_delta + 4) % 4; des = animal + dir[cur_dir]; if (ok(des, vis)) { animal = des; visit(des, vis); return; } stop = true;}bool work(){ tiger_stop = false; donkey_stop = false; memset(tiger_vis, 0, sizeof(tiger_vis)); memset(donkey_vis, 0, sizeof(donkey_vis)); if (tiger == donkey) return true; visit(tiger, tiger_vis); visit(donkey, donkey_vis); while (!(tiger_stop && donkey_stop)) { move(tiger, tiger_dir, tiger_vis, tiger_stop, -1); move(donkey, donkey_dir, donkey_vis, donkey_stop, 1); if (tiger == donkey) return true; } return false;}int main(){ while (scanf("%d", &grid_size), grid_size) { input(donkey, donkey_dir); input(tiger, tiger_dir); if (work()) printf("%d %d\n", tiger.x, tiger.y); else printf("-1\n"); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/rainydays/p/3324674.html

你可能感兴趣的文章
android开发过程中遇到错误的笔记
查看>>
JS实现继承的几种方式
查看>>
Spring MVC 4.x + fastjson 1.2.7,封装的List<?>参数
查看>>
svn培训
查看>>
js选中问题
查看>>
CentOS 7 Shell脚本编程第二讲 Shell 脚本创建和执行
查看>>
protobuf
查看>>
4.Java基础复习--Set
查看>>
七:Mysql的乐观锁与悲观锁机制
查看>>
CSS滤镜及渐变 (filter样式表属性)
查看>>
调用上面的@InitBinder 解决客户端上传时间参数转换的问题
查看>>
net.sf.json.JSONException: There is a cycle in the hierarchy异常,解决方法
查看>>
OpenStack centos版安装(二)
查看>>
Tomcat虚拟根目录与虚拟子目录
查看>>
Fragment提交transaction导致state loss异常
查看>>
Java中的ReentrantLock和synchronized两种锁定机制的对比
查看>>
Android自动化测试方向
查看>>
OpenGL ES 2.0绘制方式
查看>>
ubuntu 更新和安全
查看>>
QT中常用数据之间转换
查看>>