数字三角

一个无限等边三角形网格(数字表示网点的序号),如下面图所示:
            1
           / \
          2---3
         / \ / \
        4---5---6
       / \ / \ / \
      7---8---9--10
     / \ / \ / \ / \
    11--12--13--14--15
   / \ / \ / \ / \ / \
  16--17--18--19--20--21
...........................
例如:
  {1,2,3}、{3,8,10}、{1,11,15}是等边三角形的顶点集合
  {1,2,3,4}和{3,8,10,14}是平行四边形的顶点集合
  {2,3,4,6,8,9}是六边形的顶点集合

写一个算法,判断输入的集合属于可以接受的图形
一个图形要成为可接受的图形,必须满足如下两个条件:
 1、图形每条边必须和网格中的某条边重合(如:{2,9}是重合的,而{2,13}则不是);
 2、图形每条边必须相等。

输入
  元素个数为3、4、6的元素列表

输出
  是否可接受

输入出范例
  1,2,3=true
  1,2,3,4=false
  2,3,4,6,8,9=true

原帖地址http://community.csdn.net/Expert/topic/5369/5369826.xml?temp=.7778742


下面是我给出的答案:

  1#include "stdafx.h"
  2#include <list> 
  3#include <iostream>
  4#include "stdio.h"
  5using namespace std; 
  6
  7bool CalAngle(int *num, int *lines, int agrc);
  8int GetLine(int exp);
  9
 10int _tmain(int argc, _TCHAR* argv[])
 11{
 12    if (argc <= 1)
 13    {
 14        return 0;
 15    }

 16
 17    int *num = new int[argc - 1];
 18    int *lines = new int[argc - 1];
 19
 20    
 21    if (num == NULL || lines == NULL)
 22    {
 23        cout << "分配内存失败!" << endl;
 24        return 0;
 25    }

 26
 27    memset(num, 0, argc - 1);
 28    memset(lines, 0, argc - 1);
 29
 30    for(int i = 1; i < argc; i++)
 31    {
 32        sscanf((char*)argv[i], "%d", num + i - 1);
 33    }

 34    if (CalAngle(num, lines, argc - 1))
 35    {
 36        cout << "true" << endl;
 37    }

 38    else
 39    {
 40        cout << "false" << endl;
 41    }

 42    delete[] num;
 43    delete[] lines;
 44    return 0;
 45}

 46
 47//求两点之间距离
 48int GetDistance(int m, int n, int l1, int l2)
 49{
 50    int temp = n;
 51    if (m < n)
 52    {
 53        temp = m;
 54        m = n;
 55        n = temp;
 56    }

 57
 58    if (l1 < l2)
 59    {
 60        temp = l1;
 61        l1 = l2;
 62        l2 = temp;
 63    }

 64
 65    //判断是否在同一层上
 66    int ilen = 0;
 67    if (l1 == l2 )
 68    {
 69        //ic++;
 70        ilen = m - n; //abs(m - n);
 71        return ilen;
 72    }

 73    
 74    //左边
 75    int imax = m;
 76    int icurvalue = n;
 77    for(int  k = l2; k < l1; k++)
 78    {
 79        icurvalue += k;
 80        if ( icurvalue > imax)
 81        {
 82            break;
 83        }

 84        else if (icurvalue == imax)
 85        {
 86            ilen = abs(l1 - l2);
 87            return ilen;
 88        }

 89    }

 90
 91    //右边
 92    icurvalue = n;
 93    for(int  i = l2; ilen == 0 && i < l1; i++)
 94    {
 95        icurvalue += (i + 1);
 96        if ( icurvalue > imax)
 97        {
 98            break;
 99        }

100        else if (icurvalue == imax)
101        {
102            ilen = l1 - l2;
103            return ilen;
104        }

105    }

106    return 0;
107}

108
109bool CalAngle(int *num, int *lines, int points)
110{
111    int ilen = 0;
112    int ioldlen = 99999;
113    int *pd = new int[points * points]; //各个点之间距离
114    memset(pd, 0, points * points);
115    
116    for(int i = 0; i < points; i++)
117    {
118        *(lines + i) = GetLine(*(num + i));
119    }

120
121    //求出两点之间的最小距离
122    for(int i = 0; i < points; i++)
123    {
124        forint j = 0; j < points; j++)
125        {
126            if (i == j)
127                continue;
128            ilen = GetDistance(num[i], num[j], lines[i], lines[j]);
129            pd[i * points + j] = ilen;
130            if (ilen > 0 && ilen < ioldlen)
131            {
132                ioldlen = ilen;
133            }

134        }

135    }

136    
137    //某一点到相邻的点的距离等于最小距离的个数不为2就不符合条件
138    for(int i = 0; i < points; i++)
139    {
140        int ic = 0;
141        forint j = 0; j < points; j++)
142        {
143            if (i == j)
144            {
145                continue;
146            }

147            //int ilen = GetDistance(num[i], num[j], lines[i], lines[j]);
148            if ( pd[i * points + j] == ioldlen )
149            {
150                ic++;
151            }

152        }

153
154        if (ic != 2)
155        {
156            delete[] pd;
157            return false;
158        }

159    }

160
161    delete[] pd;
162    return true;
163}

164
165//获取某个数字所在的行数
166int GetLine(int exp)
167{
168    long sum = 0;
169    for(int i = 1; i < 10000; i++)
170    {
171        sum += i;
172        if ( exp <= sum )
173        {
174            return i;
175        }

176    }

177}

178


posted on 2007-05-27 16:21  我的blog  阅读(232)  评论(0编辑  收藏  举报

导航