回 帖 发 新 帖 刷新版面

主题:关于第69次编程比赛

请在此贴提问。
题目贴:http://www.programfan.com/club/post-280816.html

回复列表 (共26个回复)

21 楼

其实比较早就写好了,只是为了看看结果。后来也忘记贴了。
快速排序之类的不说,我说说我采用的判断点在三角形之内的方法。
转换三角形某点的坐标为(0,0),其他两个点的坐标分别为(x1,y1)和(x2,y2),点坐标为(x,y)。
按照下面的矩阵公式计算出u和v。当u>=0,v>=0并且u+v<=1的时候,点(x,y)在三角形之内。

[img]http://lh5.ggpht.com/LemonPig/SI06GJ0zMlI/AAAAAAAAAYY/DeYCYlmNpSE/s144/untitled.GIF.jpg[/img]

22 楼

to tjs125:
Shell排序法时间复杂度是O(n^1.3),不是O(nlogn)

to ppc:
我记得你好像没参赛啊,难道其中某个是你的马甲?呵呵
另外,你提供的这个算法,如何才能尽快的算出来?求矩阵的你也是件麻烦事啊。还有,他是否可以判断点在边上?如何判断?

23 楼

我写好了,忘记贴上来了。呵呵。
矩阵转换一下就是一个比较简单的公式了,轻松地算出u和v,然后就可以判断了。
之所以是>=0以及<=1,这个=就是点在边上的时候。

24 楼


楼主能不能看一下这个程序:

基本思路就是把坐标变为以给定点开始的向量  那样求夹角方便一些  

判定的标准就是3个点对应的向量中如果有两对以上夹角为直角或者钝角(也就是向量点乘的结果小于等于0)
但是若果有两个180°的角就说明三点共线了(我没有考虑有随机点跟给定点重合的情况)
在n个点里面选出3个 每种情况都要遍历  求出最小值。

#include<stdio.h>
#include<math.h>
int judge(int x[],int y[],int a,int b,int c)
  {
    int i=0,j=0,k=0;
    if(x[a]*x[b]+y[a]*y[b]<=0)
      if(x[a]*x[b]+y[a]*y[b]==-1) i++;
      else j++;
    if(x[c]*x[b]+y[c]*y[b]<=0)
      if(x[c]*x[b]+y[c]*y[b]==-1) i++;
      else j++;
    if(x[a]*x[c]+y[a]*y[c]<=0)
      if(x[a]*x[c]+y[a]*y[c]==-1) i++;
      else j++;
    if(i>=2) return(0);    //如果i大于2就表明有两个钝角 这样就是三点一线了
    else if(j>=2) return(1);  //如果有两个以上的钝角或者直角就基本上可以肯定满足条件
         else return(0);       //这个函数就是判断下标为a b c的3个点是否满足条件
  }

double mindistance(int x[],int y[],int n,int x0,int y0)
  {
    int i,j,k,flag=0;
    double min=0;
    for(i=0;i<n;i++)
      {
        x[i]=x[i]-x0;
        y[i]=y[i]-y0;
      }    //把每个点的坐标改成以目标点为起点的向量坐标(上面的那个函数就是用向量的夹角判定)
    k=2;
    for(i=0;i<n;i++)
      if(min<3*sqrt(x[i]*x[i]+y[i]*y[i]))
        min=3*sqrt(x[i]*x[i]+y[i]*y[i]);   //先赋值为可能的最大值
    while(k!=n)
      {
        for(j=n-1;j>=0;j--)
          for(i=j-1;i>=0;i--)  //对每三个进行遍历啊
            if(judge(x,y,i,j,k))
              {
                flag=1;  //存在满足条件的结果
                if(sqrt(x[i]*x[i]+y[i]*y[i])+sqrt(x[j]*x[j]+y[j]*y[j])+sqrt(x[k]*x[k]+y[k]*y[k])<min)
                  min=sqrt(x[i]*x[i]+y[i]*y[i])+sqrt(x[j]*x[j]+y[j]*y[j])+sqrt(x[k]*x[k]+y[k]*y[k]);    //求最小值
              }
      }
    if(flag) return(min);
    return(0);
  }


25 楼

您不用看了,我发现很低级的bug了

26 楼



The one [url=http://www.toppowerlevel.net]wow power leveling[/url] thing  on everyone's mind though is the new boss for the Vault of Archavon. Toravon the Ice Watcher is an [url=http://www.mogxe.com/PowerLevel.php?gid=1]wow power leveling[/url] ice giant located in the back of the zone just after the [url=http://www.toppowerlevel.net/powerlist.php?fid=688]wow power leveling[/url] first junction to the right before Archavon the Stone Watcher. The fight [url=http://www.mogxe.com/BuyGold.php?gid=1]wow gold[/url] is much like the other bosses in the dungeon and is a DPS race. Toravon can be seen [url=http://www.mogxe.com/BuyGold.php?gid=21]aion gold[/url] in 3D above.
Season 8 Start [url=http://www.mogxe.com/PowerLevel.php?gid=1]cheap wow power leveling[/url] Date
With all this said, there is [url=http://www.mogxe.com/PowerLevel.php?gid=1]buy wow power leveling[/url] no official date yet on when the new arena season will begin. But our prediction [url=http://www.toppowerlevel.net/buy.php]warcraft gold[/url] is that it will begin the same week that the Frostwing [url=http://www.toppowerlevel.net/powerlist.php?fid=7422]aion powerleveling[/url] Hall opens in Icecrown Citadel, which should be 2 weeks from now --  [url=http://www.mogxe.com/PowerLevel.php?gid=21]cheap aion power leveling[/url] on February 2, 2010.

我来回复

您尚未登录,请登录后再回复。点此登录或注册