标签:
好大的一个图片有木有,哈哈,题目来了,数出上述图形中的三角形个数。
我真的曾经十分认真的数过,我按照组成多边形的三角形的个数,从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