📄 checkcycle12.c
字号:
#include <mex.h>
#include <matrix.h>
#include <math.h>
#define NONE 0xFFFFFFFF
#define CYCLELEN 12
struct HPoint
{
int i;
int j;
};
void docheck(double *c12num, 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
//c12num=checkcycle12(h1idx)
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray*prhs[] )
{
//output
double *c12num; //pointer variable for output c12num
//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);
c12num = mxGetPr(plhs[0]);
//input parameter
h1idx = mxGetPr(prhs[0]);
//local variable
rows = mxGetM(prhs[0]);
cols = mxGetN(prhs[0]);
docheck(c12num, h1idx, (int)rows, (int)cols);
}
void docheck(double *c12num, double *h1idx, int rows, int cols)
{
int c0, c1, c2, c3, c4, c5;
double *c0base, *c1base, *c2base, *c3base, *c4base, *c5base;
int r00, r01;
int r10, r11;
int r20, r21;
int r30, r31;
int r40, r41;
int r50, r51;
// int ccnt;
struct HPoint p[CYCLELEN];
// ccnt = 0;
for (c0=0; c0<cols-5;c0++)
for (c1=c0+1;c1<cols-4;c1++)
for (c2=c1+1;c2<cols-3;c2++)
for (c3=c2+1;c3<cols-2;c3++)
for (c4=c3+1;c4<cols-1;c4++)
for (c5=c4+1;c5<cols; c5++)
{
c0base = h1idx+c0*rows;
c1base = h1idx+c1*rows;
c2base = h1idx+c2*rows;
c3base = h1idx+c3*rows;
c4base = h1idx+c4*rows;
c5base = h1idx+c5*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++)
for (r30=1;r30<(int)*c3base;r30++)
for (r31=r30+1;r31<=(int)*c3base;r31++)
for (r40=1;r40<(int)*c4base;r40++)
for (r41=r40+1;r41<=(int)*c4base;r41++)
for (r50=1;r50<(int)*c5base;r50++)
for (r51=r50+1;r51<=(int)*c5base;r51++)
{
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;
p[6].i = (int)*(c3base+r30);
p[6].j = c3+1;
p[7].i = (int)*(c3base+r31);
p[7].j = c3+1;
p[8].i = (int)*(c4base+r40);
p[8].j = c4+1;
p[9].i = (int)*(c4base+r41);
p[9].j = c4+1;
p[10].i = (int)*(c5base+r50);
p[10].j = c5+1;
p[11].i = (int)*(c5base+r51);
p[11].j = c5+1;
if (iscycle(p))
{
mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),", p[0].i, p[0].j, p[1].i, p[1].j, p[2].i, p[2].j, p[3].i, p[3].j);
mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),", p[4].i, p[4].j, p[5].i, p[5].j, p[6].i, p[6].j, p[7].i, p[7].j);
mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d)\n", p[8].i, p[8].j, p[9].i, p[9].j, p[10].i, p[10].j, p[11].i, p[11].j);
// ccnt++;
*c12num = 1;
return;
}
}
}
// *c12num = 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 + -