triangle group
This commit is contained in:
61
triangle.c
Normal file
61
triangle.c
Normal file
@@ -0,0 +1,61 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <memory.h>
|
||||
|
||||
#include "triangle.h"
|
||||
#include "queue.h"
|
||||
|
||||
static groupelement_t *find_adj(groupelement_t *cur, int gen, int other, int order)
|
||||
{
|
||||
groupelement_t *next = cur->adj[other];
|
||||
for(int i = 0; i < order - 1; i++) {
|
||||
if(!next)
|
||||
break;
|
||||
next = next->adj[gen];
|
||||
if(!next)
|
||||
break;
|
||||
next = next->adj[other];
|
||||
}
|
||||
return next;
|
||||
}
|
||||
|
||||
int generate_triangle_group(groupelement_t *group, int size, int k1, int k2, int k3)
|
||||
{
|
||||
queue_t q;
|
||||
int id, n;
|
||||
groupelement_t *cur;
|
||||
|
||||
int k[3] = {k1, k2, k3};
|
||||
|
||||
memset(group, 0, size*sizeof(groupelement_t));
|
||||
n = 1;
|
||||
queue_init(&q);
|
||||
queue_put(&q, 0);
|
||||
|
||||
while((id = queue_get(&q)) != -1) {
|
||||
cur = &group[id];
|
||||
|
||||
for(int gen = 0; gen < 3; gen++) {
|
||||
if(!cur->adj[gen])
|
||||
cur->adj[gen] = find_adj(cur, gen, (gen+2)%3, k[(gen+1)%3]);
|
||||
|
||||
if(!cur->adj[gen])
|
||||
cur->adj[gen] = find_adj(cur, gen, (gen+1)%3, k[(gen+2)%3]);
|
||||
|
||||
if(!cur->adj[gen] && n < size) {
|
||||
cur->adj[gen] = &group[n];
|
||||
cur->adj[gen]->id = n;
|
||||
cur->adj[gen]->parent = cur;
|
||||
cur->adj[gen]->letter = gen;
|
||||
cur->adj[gen]->length = cur->length + 1;
|
||||
queue_put(&q, n);
|
||||
n++;
|
||||
}
|
||||
|
||||
if(cur->adj[gen])
|
||||
cur->adj[gen]->adj[gen] = cur;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
Reference in New Issue
Block a user