标签:
好大的一个图片有木有,哈哈,题目来了,数出上述图形中的三角形个数。
我真的曾经十分认真的数过,我按照组成多边形的三角形的个数,从1-9依次数来,但是很悲催,我把一个多边形组成的三角形数出了九个(汗一个,我姥姥都知道只有五个),结果数出了28个。最终用代码确认结果,只有24个,仔细检查下,才发现这个错误。下面是我用c11写的代码,不得不说c11中的不少新语法,真心很好用。
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdarg.h>
using namespace std;
typedef int VERTEX;
typedef vector<VERTEX> LINE; // 共线的n个点为一条边
typedef struct _graph{
vector<VERTEX> _vertexes;
vector<LINE> _lines;
}GRAPH;
GRAPH g_graph;
int g_count = 0;
bool in_same_line(VERTEX va, VERTEX vb)
{
auto itor = g_graph._lines.begin();
while(itor != g_graph._lines.end())
{
if (find(itor->begin(), itor->end(), va) != itor->end() &&
find(itor->begin(), itor->end(), vb) != itor->end())
{
return true;
}
itor++;
}
return false;
}
bool in_same_line(VERTEX va, VERTEX vb, VERTEX vc)
{
auto itor = g_graph._lines.begin();
while(itor != g_graph._lines.end())
{
if (find(itor->begin(), itor->end(), va) != itor->end() &&
find(itor->begin(), itor->end(), vb) != itor->end() &&
find(itor->begin(), itor->end(), vc) != itor->end())
{
return true;
}
itor++;
}
return false;
}
void add_vertex(int index, ...)
{
va_list argptr;
va_start(argptr, index); //初始化变元指针
int sum = index;
index = va_arg(argptr, int); //作为下一个参数类型的参数类型,返回不定参数
while(1) //末尾特定字符指示结束
{
g_graph._vertexes.push_back(index);
index = va_arg(argptr, int);
if (index>10)
{
break;
}
}
va_end(argptr);
}
// 添加一条边
void add_side(int vertex, ...)
{
va_list argptr;
va_start(argptr, vertex); //初始化变元指针
int sum = vertex;
vertex = va_arg(argptr, int); //作为下一个参数类型的参数类型,返回不定参数
LINE line;
//c保存第一个不定参数
while(1) //末尾特定字符指示结束
{
line.push_back(vertex);
vertex = va_arg(argptr, int);
if (vertex>10)
{
break;
}
}
va_end(argptr);
g_graph._lines.push_back(line);
}
// 初始化图
void init()
{
// 添加顶点
add_vertex(0,1,2,3,4,5,6,7,8,9,10);
// 添加线段
add_side(0,1,7);
add_side(0,2,6,8);
add_side(0,3,5,9);
add_side(0,4,10);
add_side(1,2,3,4);
add_side(4,5,6,7);
add_side(7,8,9,10);
}
// 计算三角形的个数
void count()
{
auto vertexes = g_graph._vertexes;
for (size_t i=0; i<vertexes.size(); i++)
{
for (size_t j=i+1; j<vertexes.size(); j++)
{
for (size_t k=j+1; k<vertexes.size(); k++)
{
if (in_same_line(i,j) &&
in_same_line(i,k) &&
in_same_line(j,k) &&
!in_same_line(i,j,k))
{
g_count++;
}
}
}
}
}
void main()
{
init();
count();
cout<<g_count;
system("pause");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/fukainankai/article/details/47126445