哈理工 1304 13哥的机器人

13哥的机器人
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 367(117 users) Total Accepted: 133(103 users) Rating:  Special Judge: No
Description
13哥酷爱学习,13哥经过短暂学习后设计出来一机器人。13哥的机器人唯一缺陷是当遇到转弯时,就不知道该怎么走了,但是经过13哥的努力,这个机器人可以根据声音来转动方向,在没有声音的情况下沿直线行走。所以只能麻烦13哥在机器人遇到转弯时候,告诉机器人向左还是向右。
Input
有多组测试数据,第一行输入整数n,表示n个点(n>=3),接下来的n行每行输入一对数字x,y表示平面坐标系线路上的转折点(第一行是起点,最后一行是结束点)。当n为0时结束。
Output
对于每组输入数据单独一行,如果机器人往左转输出L,右则输出R
Sample Input

5

0 0

0 1

-1 1

-1 0

0 0

Sample Output
LLL
Author
鲁学涛

这个题还算是相当坑的一道题了。我最开始就是以为x.y的单纯某一个计算,然后用了标记法来解题,设四个方向,然后移动后的坐标和当前坐标比较,然后看看是向哪边走了。然后光荣的WA了。。。。(原因很简单,如果x。y一起变化我这招就不行了)。

然后才意识到这个题目是计算几何相关。我们这里用三个点做文章,如果叉乘>0说明夹角是顺时针过来的,那就说明是右转了。


然后上AC代码:

/*被坑了的标记法。。。
#include<stdio.h>
#include<string.h>
using namespace std;
struct zuobiao
{
    int x,y,cur;
}a[121212];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        a[0].cur=1;
        for(int i=0;i<n-2;i++)
        {
            if(a[i].cur==1)
            {
                if(a[i+1].y>a[i].y)
                {
                    a[i+1].cur=2;
                    printf("L");
                }
                if(a[i+1].y<a[i].y)
                {
                    a[i+1].cur=4;
                    printf("R");
                }
            }
            if(a[i].cur==2)
            {
                if(a[i+1].x<a[i].x)
                {
                    a[i+1].cur=3;
                    printf("L");
                }
                if(a[i+1].x>a[i].x)
                {
                    a[i+1].cur=1;
                    printf("R");
                }
            }
            if(a[i].cur==3)
            {
                if(a[i+1].y<a[i].y)
                {
                    a[i+1].cur=4;
                    printf("L");
                }
                if(a[i].y>a[i].y)
                {
                    a[i+1].cur=2;
                    printf("R");
                }
            }
            if(a[i].cur==4)
            {
                if(a[i+1].x>a[i].x)
                {
                    a[i+1].cur=1;
                    printf("L");
                }
                if(a[i+1].x<a[i].x)
                {
                    a[i+1].cur=3;
                    printf("R");
                }
            }
        }
        printf("\n");
    }
}
*/
/*叉乘求顺逆针夹角判断左转还是右转*/
#include<stdio.h>
#include<string.h>
using namespace std;
struct zuobiao
{
    int x,y;
}a[200];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)
        break;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        for(int i=0;i<n-2;i++)
        {
            if((a[i+2].x-a[i].x)*(a[i+1].y-a[i].y)-(a[i+1].x-a[i].x)*(a[i+2].y-a[i].y)>0)
            printf("R");
            if((a[i+2].x-a[i].x)*(a[i+1].y-a[i].y)-(a[i+1].x-a[i].x)*(a[i+2].y-a[i].y)<0)
            printf("L");
        }
        printf("\n");
    }
}








你可能感兴趣的:(哈理工ACM,1304,哈理工oj,1304,哈理工,1304)