您的位置:首页 > 其它

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

2014-04-25 21:45 204 查看

图形密码

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

题目描述

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

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

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int zong;
cin>>zong;
while(zong--)
{
int n;
int flag1=-1;//保存前一个状态的标志变量
cin>>n;
int x[200],y[200];
for(int i=1;i<=n;i++)
{
cin>>x[i];
cin>>y[i];
}
for(int i=2;i<=n-1;i++)
{
int flag2=0;
int x1=x[i-1]-x[i];
int y1=y[i-1]-y[i];
int x2=x[i+1]-x[i];
int y2=y[i+1]-y[i];
if(x1*y2-x2*y1>0)
flag2=1;//顺时针旋转
else if(x1*y2-x2*y1<0)
flag2=2;//逆时针旋转
else
flag2=0;//平行不旋转
if(flag1==-1&&flag2!=0)//如果发生了旋转事件就以此状态初始化flag1,这条语句只执行一次
flag1=flag2;
if(flag1!=-1&&flag2!=0&&flag1!=flag2)//这三个条件缺一不可
{
if(flag1==1)//前一个状态是顺时针旋转
{
cout<<"clockwise ("<<x[i]<<","<<y[i]<<") ";
}
else if(flag1==2)//前一个状态是逆时针旋转
{
cout<<"counterclockwise ("<<x[i]<<","<<y[i]<<") ";
}
flag1=flag2;//用flag1保存改变以后的状态
}
}
if(flag1==1)//最后的状态是顺时针旋转
{
cout<<"clockwise"<<endl;
}
else//最后的状态是逆时针旋转,无论flag1是-1(n==0)还是flag1==2(最后真的是逆时针旋转了)或者是flag==0(平行不旋转的情况,比如n==2,输入 1 1 1 2)
cout<<"counterclockwise"<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: