Right turn

题目链接(点击)

frog is trapped in a maze. The maze is infinitely large and divided into grids. It also consists of nn obstacles, where the ii-th obstacle lies in grid (xi,yi)(xi,yi).

frog is initially in grid (0,0)(0,0), heading grid (1,0)(1,0). She moves according to The Law of Right Turn: she keeps moving forward, and turns right encountering a obstacle.

The maze is so large that frog has no chance to escape. Help her find out the number of turns she will make.

Input

The input consists of multiple tests. For each test:

The first line contains 11 integer nn (0≤n≤1030≤n≤103). Each of the following nn lines contains 22 integers xi,yixi,yi. (|xi|,|yi|≤109,(xi,yi)≠(0,0)|xi|,|yi|≤109,(xi,yi)≠(0,0), all (xi,yi)(xi,yi) are distinct)

Output

For each test, write 11 integer which denotes the number of turns, or ``-1'' if she makes infinite turns.

Sample Input

    2
1 0
0 -1
1
0 1
4
1 0
0 1
0 -1
-1 0

Sample Output

    2
0
-1

题意:

在无边界的坐标中 给出n个石头所在坐标 开始在坐标原点 头朝向x轴正方向 每次可以走无数步 但要求所走的是一条直线 如果前面遇到石头 则右转 最后输出转向次数 如果永远出不去 则输出 -1

思路:

很好的一道模拟题 记录 头的朝向 和 每个石头所在位置

从原点开始 判断在这一行有没有石头并且y的坐标相同 如果有则所在位置移动到该石头的前一个点 转向次数+1 然后把头转向

如果没有 直接输出转向次数

如果一直在坐标系中转圈 输出-1 所以需要标记

做题的时候遇到两个问题:

错误一、我用了1维数组标记走过的石头 如果下次再遇到 就输出-1

因为:有可能出现下面这种情况 并不需要输出-1

红点走了两次而不需要输出-1

解决方法:

不仅要标记走过的石头还要标记从哪个方向过来这个石头的 如果下次还是这个方向过来的肯定要输出-1了

错误二、  对输入的坐标先进行了sort排序

因为cmp函数中只是进行了将x从小到大排序  而y并非也是从小到大排序 所以若要找到在其前方(因为是往头所指的方向走 所以是前面)第一个符合条件的坐标 要分别按x或y排序才可以(我没试 但估计会T)

也可以每次都把所有坐标都跑一边 找到在其前方的第一个符合条件的点(具体可以看代码中judge函数)

AC代码:

#include<stdio.h>
#include<string.h>
const int INF=1e9+5;
const int MAX=1e3;
int n;
int flag[MAX+5][5],head;
struct node{
int x;
int y;
}edge[MAX+5];
int judge(int x,int y)
{
if(head==1){
int minn=INF,minn1;
for(int i=0;i<n;i++){
if(edge[i].x<minn&&edge[i].x>x&&edge[i].y==y){
minn=edge[i].x;
minn1=i;
}
}
if(minn==INF){
return -2;
}
else if(flag[minn1][1]==1){
return -1;
}
else{
flag[minn1][1]=1;
return minn1;
}
}
else if(head==2){
int minn=-INF,minn1;
for(int i=0;i<n;i++){
if(edge[i].y>minn&&edge[i].y<y&&edge[i].x==x){
minn=edge[i].y;
minn1=i;
}
}
if(minn==-INF){
return -2;
}
else if(flag[minn1][2]==1){
return -1;
}
else{
flag[minn1][2]=1;
return minn1;
}
}
else if(head==3){
int minn=-INF,minn1;
for(int i=0;i<n;i++){
if(edge[i].x>minn&&edge[i].x<x&&edge[i].y==y){
minn=edge[i].x;
minn1=i;
}
}
if(minn==-INF){
return -2;
}
else if(flag[minn1][3]==1){
return -1;
}
else{
flag[minn1][3]=1;
return minn1;
}
}
else{
int minn=INF,minn1;
for(int i=0;i<n;i++){
if(edge[i].y<minn&&edge[i].y>y&&edge[i].x==x){
minn=edge[i].y;
minn1=i;
}
}
if(minn==INF){
return -2;
}
else if(flag[minn1][4]==1){
return -1;
}
else{
flag[minn1][4]=1;
return minn1;
}
}
}
int main()
{
while(~scanf("%d",&n)){
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
scanf("%d%d",&edge[i].x,&edge[i].y);
}
int x=0,y=0,ans=0;head=1;
while(1){
//printf("%d %d\n",x,y);
int num=judge(x,y);
//printf("%d\n",num);
if(num==-1){
printf("-1\n");
break;
}
else if(num==-2){
printf("%d\n",ans);
break;
}
else{
ans++;
if(head==1){
head=2;
x=edge[num].x-1,y=edge[num].y;
}
else if(head==2){
head=3;
x=edge[num].x,y=edge[num].y+1;
}
else if(head==3){
head=4;
x=edge[num].x+1,y=edge[num].y;
}
else{
head=1;
x=edge[num].x,y=edge[num].y-1;
}
}
}
}
return 0;
}

Right turn【模拟+标记】的更多相关文章

  1. 牛客国庆集训day6 B Board (模拟标记思维或找规律或分块???)

    链接:https://www.nowcoder.com/acm/contest/206/B来源:牛客网 题目描述 恬恬有一个nx n的数组.她在用这个数组玩游戏: 开始时,数组中每一个元素都是0. 恬 ...

  2. hihocoder #1062 : 最近公共祖先·一(小数据量 map+set模拟+标记检查 *【模板】思路 )

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...

  3. IIS 之 Web 服务器上的 ASP.NET 进程模型设置

    配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置. processModel 节只能在 Machine.config 文件中进行设置, ...

  4. ASP.NET底层与各个组件的初步认识与理解 (转载)

    ASP.NET底层的初步认识与理解   最近在国外的网站乱走一通,发现一些比较好的文章,收集整理加于自己的理解,作为笔记形式记录下来,让以后自己有个回忆. ASP.NET是一个非常强大的构建Web应用 ...

  5. Codeforces Round #138 (Div. 1)

    A 记得以前做过 当时好像没做对 就是找个子串 满足括号的匹配 []最多的 开两个栈模拟 标记下就行 #include <iostream> #include<cstring> ...

  6. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

    前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...

  7. Northwestern European Regional Contest 2016 NWERC ,F题Free Weights(优先队列+Map标记+模拟)

    传送门: Vjudge:https://vjudge.net/problem/Gym-101170F CF: http://codeforces.com/gym/101170 The city of ...

  8. 模拟+贪心 SCU 4445 Right turn

    题目传送门 /* 题意:从原点出发,四个方向,碰到一个点向右转,问多少次才能走出,若不能输出-1 模拟:碰到的点横坐标相等或纵坐标相等,然而要先满足碰到点最近, 当没有转向或走到之前走过的点结束循环. ...

  9. 使用python通过selenium模拟打开chrome窗口报错 出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors

    #在程序前加上这段代码 from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimen ...

随机推荐

  1. jsp 判断时间大小

    jsp 判断时间大小 <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date ...

  2. 关于php中数据提交到当前页面action的问题

    关于php中数据提交到当前页面action的问题 2011-06-21 17:45杨超★杰伦 | 分类:PHP | 浏览695次 php中数据提交到当前页面,有人action=“<?php ec ...

  3. 二、HTML基础标签4个

    标题标签<h1> —— <h6> <!DOCTYPE html> <html> <head> <meta charset=" ...

  4. PHP 数据库操作函数笔记

    /建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysqli_connect('127.0.0.1','root','123456','php1',3306); if(mys ...

  5. 【Copy攻城狮日志】Node快速重命名文件,告别Potplay字幕困扰问题

    ↑开局一张图,故事全靠编↑ 前言 Copy攻城狮日志的惯例,开局一张图,开始为您讲述一个鲜为人知的故事.故事的开头要从本大狮从盗版网站下载udemy课程的犯罪伊始说起,去年的某月某天,我真正接触到了“ ...

  6. Kubectl exec 的工作原理解读

    对于经常和 Kubernetes 打交道的 YAML 工程师来说,最常用的命令就是 kubectl exec 了,通过它可以直接在容器内执行命令来调试应用程序.如果你不满足于只是用用而已,想了解 ku ...

  7. [ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)

    [原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 今天总结一下 ES6 中跟参数相关的内容. 欢迎补充斧正.留言交流. 让我们互相学习一起进步. 1. ES6 参数默认值( ...

  8. Linux学习(一):常用命令

    init 0:关机 init 3:命令行模式 init 5:图形界面模式 init 6:重启 shutdown -h now:立马关机 ls:文件列表 参数:-l 详细列表 cd:切换目录 用法实例: ...

  9. 题解 P6509 【[CRCI2007-2008] JEDNAKOST】

    洛谷题目传送门!! 洛谷博客!! 这道题感觉是一个很另类的DP  至少我的做法是这样的. 重要前置思想:把A存成字符串!!! (应该也没人会想着存成int和long long 吧) 首先,我们定义状态 ...

  10. eatwhatApp开发实战(五)

    上次我们为eatwhat添加了了删除功能和dialog对话框的介绍,今天我们来使用SQLite进行本地数据存储. 首先,我们定义一个SQL辅助类ShopInfoOpenHelper继承SQLiteOp ...