zoukankan      html  css  js  c++  java
  • POJ


    题意:在一个平面直角坐标系,一个点总是从原点出发,但是每次移动只能移动8个方向的中的一个并且每次移动距离
    只有1和√2这两种情况,最后一定会回到原点(以字母5结束),请你计算这个点所画出图形的面积

    题解:

    叉积又叫向量积,如下图

     设AC这条边为向量a,AB这条边为向量b,夹角为

     那么会有:

     

    那么一个多边形肯定是可以分解成多个三角形的,把它们的面积加到一起就行了

    我们知道三角形的角度不是那么容易就可以求出来的,而且通过向量坐标也可以求向量积的模(下面给出三维模式下的)

    二位模式下:

    向量a=(x1,y1),向量b=(x2,y2)

    (向量a*向量b)的模=x1*y2-x2*y1

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<vector>
     7 #include<queue>
     8 #include<stack>
     9 #include<map>
    10 using namespace std;
    11 typedef long long ll;
    12 const int maxn=1e6+10;
    13 const int INF=0x3f3f3f3f;
    14 const double eps=1e-8;
    15 const double PI=3.1415926;
    16 const int mod = 1e9+7;
    17 #define mt(A,B) memset(A,B,sizeof(A))
    18 #define lson l,m,rt*2
    19 #define rson m+1,r,rt*2+1
    20 #define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    21 #define zero(x) (((x)>0?(x):-(x))<eps)
    22 int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,1},{1,-1},{-1,-1}};//8个方向
    23 char str[maxn];
    24 int main()
    25 {
    26     int T;
    27     int n,m,i,j;
    28     int x,y,u,v;
    29     long long A;
    30     cin>>T;
    31     while(T--)
    32     {
    33         cin>>str;
    34         n=strlen(str);
    35         x=0;
    36         y=0;
    37         A=0;
    38         for(i=0;i<(n-1);i++)
    39         {
    40             if(str[i]=='8')
    41             {
    42                 u=x+dir[0][0];
    43                 v=y+dir[0][1];
    44             }
    45             else if(str[i]=='2')
    46             {
    47                 u=x+dir[1][0];
    48                 v=y+dir[1][1];
    49             }
    50             else if(str[i]=='6')
    51             {
    52                 u=x+dir[2][0];
    53                 v=y+dir[2][1];
    54             }
    55             else if(str[i]=='4')
    56             {
    57                 u=x+dir[3][0];
    58                 v=y+dir[3][1];
    59             }
    60             else if(str[i]=='9')
    61             {
    62                 u=x+dir[4][0];
    63                 v=y+dir[4][1];
    64             }
    65             else if(str[i]=='7')
    66             {
    67                 u=x+dir[5][0];
    68                 v=y+dir[5][1];
    69             }
    70             else if(str[i]=='3')
    71             {
    72                 u=x+dir[6][0];
    73                 v=y+dir[6][1];
    74             }
    75             else if(str[i]=='1')
    76             {
    77                 u=x+dir[7][0];
    78                 v=y+dir[7][1];
    79             }
    80             A+=(u*y)-(v*x);//(u,v),(x,y)和(0,0)原点的叉积算出三角形的面积
    81             x=u;
    82             y=v;
    83         }
    84         if(A<0)//顺时针计算是负值
    85             A=-A;
    86         if(A%2==0)//如果面积可以整除2那么不会有精度缺失
    87             cout<<A/2<<endl;
    88         else//否则要加上0.5
    89             cout<<A/2<<".5"<<endl;
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    Js注释和对象
    卸载Oracle
    数据库设计三大范式
    Oracle用户管理
    Oracle权限管理详解
    Linux 性能监控之CPU&内存&I/O监控Shell脚本2
    Linux 性能监控之CPU&内存&I/O监控Shell脚本1
    Windows Win7建立wifi热点,手机共享WIFI上网
    Mariadb MySQL逻辑条件判断相关语句、函数使用举例介绍
    Mariadb MySQL、Mariadb中GROUP_CONCAT函数使用介绍
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12797633.html
Copyright © 2011-2022 走看看