数字三角
一个无限等边三角形网格(数字表示网点的序号),如下面图所示:
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"
5
using namespace std;
6
7
bool CalAngle(int *num, int *lines, int agrc);
8
int GetLine(int exp);
9
10
int _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
//求两点之间距离
48
int 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
109
bool 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
//获取某个数字所在的行数
166
int 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
#include "stdafx.h"2
#include <list> 3
#include <iostream>4
#include "stdio.h"5
using namespace std; 6

7
bool CalAngle(int *num, int *lines, int agrc);8
int GetLine(int exp);9

10
int _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
else39
{40
cout << "false" << endl;41
}42
delete[] num;43
delete[] lines;44
return 0;45
}46

47
//求两点之间距离48
int 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

109
bool 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
//获取某个数字所在的行数166
int 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



浙公网安备 33010602011771号