• 【叉积】【sdut 2508 图形密码】


    图形密码

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

    题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2508

    触屏手机上的图形密码是一种简单有效的安全措施,有利于保护我们的隐私。小明新买了一台触屏手机,对手机上的图形密码很感兴趣,仔细研究了图形密码的构成,发现图形密码的构成连线方向可以分为顺时针和逆时针两类,有人喜欢顺时针滑动手指解码,有人喜欢逆时针解码,有人会交替两种方向。小明想做个调查,他需要记录解码连线的方向,打算通过编程来完成这个任务,你能帮助他吗? 

    输入

    第一行输入一个数T代表测试数据个数(T<=500)。每个测试样例第一行有一个n代表有序点对个数。接下来1行n对x,y,分别代表一个点对。(1<=x,y<=6  1<=n<=100)
     

    输出

    连线的方向为顺时针(clockwise),还是逆时针(counterclockwise),如果方向发生变化,则输出变化前的方向,变化点的坐标和变化后的方向。比如上图所示的密码锁的解码方向为:clockwise (2,2)  counterclockwise 使用空格分开,不同的项。每行输出一个结果。
     

    示例输入

    3
    5
    1 1 2 1 3 1 3 2 3 3
    8
    1 1 1 2 1 3 2 3 3 3 3 2 3 1 2 1
    7
    1 1 1 2 1 3 2 2 3 1 3 2 3 3
    

    示例输出

    counterclockwise
    clockwise
    clockwise (3,1) counterclockwise
    

    提示

     

    来源

     中国海洋大学第三届“朗讯杯”编程比赛高级组试题

    示例程序

    解题思路:

         用叉积判断当前的旋转方向,我用flag1保存前一个状态,用flag2表示当前的状态,那么当flag1!=flag2的时候,表明现在的方向发生了改变(flag1!=-1&&flag2!=0,原因是flag1=-1表示是初始状态,这时候flag2是什么状态都不影响;如果flag2=0,那么表示当前无变化,flag1是什么状态都不影响),用1表示顺时针旋转的状态,用2表示逆时针旋转状态,用0表示无变化,特别的,初始化flag1=-1不代表任何状态(初始状态,可以认为是顺时针也可以是逆时针,当输入一组数据的时候结果无论是顺时针还是逆时针都算对,因为只有一组数据是无法判断是顺时针还是逆时针的),注意叉积的计算公式和谁在前谁在后,这是影响题目结果的核心问题。

    叉积详解:http://blog.csdn.net/william001zs/article/details/6213485

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 int main()
     5 {
     6     int zong;
     7     cin>>zong;
     8     while(zong--)
     9     {
    10         int n;
    11         int flag1=-1;//保存前一个状态的标志变量
    12         cin>>n;
    13         int x[200],y[200];
    14         for(int i=1;i<=n;i++)
    15         {
    16             cin>>x[i];
    17             cin>>y[i];
    18         }
    19         for(int i=2;i<=n-1;i++)
    20         {
    21             int flag2=0;
    22             int x1=x[i-1]-x[i];
    23             int y1=y[i-1]-y[i];
    24             int x2=x[i+1]-x[i];
    25             int y2=y[i+1]-y[i];
    26             if(x1*y2-x2*y1>0)
    27                 flag2=1;//顺时针旋转
    28             else if(x1*y2-x2*y1<0)
    29                 flag2=2;//逆时针旋转
    30             else
    31                 flag2=0;//平行不旋转
    32             if(flag1==-1&&flag2!=0)//如果发生了旋转事件就以此状态初始化flag1,这条语句只执行一次
    33                 flag1=flag2;
    34             if(flag1!=-1&&flag2!=0&&flag1!=flag2)//这三个条件缺一不可
    35             {
    36                 if(flag1==1)//前一个状态是顺时针旋转
    37                 {
    38                     cout<<"clockwise ("<<x[i]<<","<<y[i]<<") ";
    39                 }
    40                 else if(flag1==2)//前一个状态是逆时针旋转
    41                 {
    42                     cout<<"counterclockwise ("<<x[i]<<","<<y[i]<<") ";
    43                 }
    44                 flag1=flag2;//用flag1保存改变以后的状态
    45             }
    46         }
    47         if(flag1==1)//最后的状态是顺时针旋转
    48         {
    49             cout<<"clockwise"<<endl;
    50         }
    51         else//最后的状态是逆时针旋转,无论flag1是-1(n==0)还是flag1==2(最后真的是逆时针旋转了)或者是flag==0(平行不旋转的情况,比如n==2,输入 1 1 1 2)
    52             cout<<"counterclockwise"<<endl;
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    Python操作Mongo数据库
    Python正则模块
    Python时间模块
    Python协程(下)
    Python协程(中)
    Python协程(上)
    aiohttp
    常用排序算法的Python实现
    江苏省各地级市58同城租房数据
    百合网
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3690214.html
Copyright © 2020-2023  润新知