📄 checkcycle6.c
字号:
#include <mex.h>
#include <matrix.h>
#include <math.h>
#define NONE 0xFFFFFFFF
#define CYCLELEN 6
struct HPoint
{
int i;
int j;
};
void docheck(double *c6num, double **h1idx, int rows, int cols);
bool iscycle(struct HPoint *p);
int findnext(struct HPoint *p, int startp);
void exchange(struct HPoint *p, int idx1, int idx2);
// 0 0
//c6num=checkcycle6(h1idx)
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray*prhs[] )
{
//output
double *c6num; //pointer variable for output c6num
//input parameter
double *h1idx; //pointer variable for input matrix h1idx
//local variable
double rows; //h1idx matrix rows
double cols; //h1idx matrix cols
//output
plhs[0] = mxCreateDoubleScalar(0);
c6num = mxGetPr(plhs[0]);
//input parameter
h1idx = mxGetPr(prhs[0]);
//local variable
rows = mxGetM(prhs[0]);
cols = mxGetN(prhs[0]);
docheck(c6num, h1idx, (int)rows, (int)cols);
}
void docheck(double *c6num, double *h1idx, int rows, int cols)
{
int c0, c1, c2;
double *c0base, *c1base, *c2base;
int r00, r01;
int r10, r11;
int r20, r21;
// int ccnt;
struct HPoint p[CYCLELEN];
// ccnt = 0;
for (c0=0; c0<cols-2;c0++)
for (c1=c0+1;c1<cols-1;c1++)
for (c2=c1+1;c2<cols; c2++)
{
c0base = h1idx+c0*rows;
c1base = h1idx+c1*rows;
c2base = h1idx+c2*rows;
for (r00=1;r00<(int)*c0base;r00++)
for (r01=r00+1;r01<=(int)*c0base;r01++)
for (r10=1;r10<(int)*c1base;r10++)
for (r11=r10+1;r11<=(int)*c1base;r11++)
for (r20=1;r20<(int)*c2base;r20++)
for (r21=r20+1;r21<=(int)*c2base;r21++)
{
p[0].i = (int)*(c0base+r00);
p[0].j = c0+1;
p[1].i = (int)*(c0base+r01);
p[1].j = c0+1;
p[2].i = (int)*(c1base+r10);
p[2].j = c1+1;
p[3].i = (int)*(c1base+r11);
p[3].j = c1+1;
p[4].i = (int)*(c2base+r20);
p[4].j = c2+1;
p[5].i = (int)*(c2base+r21);
p[5].j = c2+1;
if (iscycle(p))
{
mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),(%d %d),(%d %d)\n", p[0].i, p[0].j, p[1].i, p[1].j, p[2].i, p[2].j, p[3].i, p[3].j, p[4].i, p[4].j, p[5].i, p[5].j);
// ccnt++;
*c6num = 1;
return;
}
}
}
// *c6num = ccnt;
// return;
}
bool iscycle(struct HPoint *p)
{
int i;
int nextpoint;
for (i=1;i<CYCLELEN;i++)
{
nextpoint = findnext(p,i);
if (nextpoint==NONE)
return false;
else if (nextpoint!=i)
exchange(p, i, nextpoint);
}
if (p[0].i==p[CYCLELEN-1].i)
return true;
else
return false;
}
int findnext(struct HPoint *p, int startp)
{
int i;
i = startp;
if (startp%2==1)
{
while (i<CYCLELEN && p[startp-1].j!=p[i].j)
i++;
if (i==CYCLELEN)
i = NONE;
}
else
{
while (i<CYCLELEN && p[startp-1].i!=p[i].i)
i++;
if (i==CYCLELEN)
i = NONE;
}
return i;
}
void exchange(struct HPoint *p, int idx1, int idx2)
{
int temp;
temp = p[idx1].i;
p[idx1].i = p[idx2].i;
p[idx2].i = temp;
temp = p[idx1].j;
p[idx1].j = p[idx2].j;
p[idx2].j = temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -