数字三角
一个无限等边三角形网格(数字表示网点的序号),如下面图所示:
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 for( int 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 for( int 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
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 for( int 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 for( int 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