#include <stdio.h> #include <stdlib.h>
#define N 14
#define true 1
#define false 0
/*
例如,对于00100101011101,变换过程是:
(1)11111101000001 注:红色字是变化过的
(2)00000001111111
(3)11111110000000
(4)00000001111111已经出现,结束。
*/
int temp[N+1] = {0};//存储孤立的点
int g_ulCount = 0;//转换次数
void reverse(int *psrc,int pdst[N][N+1])
{
int i;
g_ulCount++;
memcpy(&pdst[g_ulCount],psrc,(N+1)*sizeof(int));
for (i=1;i<=N;i++)
{
if(temp[i]!=1)
{
*((int *)&pdst[g_ulCount]+i) = psrc[i] ^ 0x01;
}
else
temp[i] = 0;
}
}
int cmp(int *psrc,int pdst[N][N+1])
{
int i;
for (i=1;i<g_ulCount;i++)
{
if (!memcmp(psrc,&pdst[i],(N+1)*sizeof(int)))
{
return true;
}
}
return false;
}
void display(int pdst[N][N+1])
{
int i;
printf("第 %d 次转换结果是:/n/r",g_ulCount);
for (i=1;i<=N;i++)
{
printf("%d",*((int *)&pdst[g_ulCount]+i));
}
printf("/n");
}
int main( void )
{
int i;
int src[N+1] = {0,0,0,1,0,0,1,0,1,0,1,1,1,0,1};
int dst[N][N+1] = {0};
while(1)
{
//遍历找出孤立元素
for (i=1;i<=N;i++)
{
if (1==i)
{
if(src[i] == src[i+1])
continue;
temp[1] = 1;
}
else if (N==i)
{
if(src[i] == src[i-1])
continue;
temp[N] = 1;
}
else if ((src[i] == src[i+1])||(src[i] == src[i-1]))
{
continue;
}
temp[i] = 1;
}
//整个数组元素取反
reverse(src,dst);
//显示变换次数和变换后的元素
display(dst);
memcpy(src,&dst[g_ulCount],(N+1)*sizeof(int));
//比较是否和之前相等
if(true == cmp(src,dst))
break;
}
printf("输出最后的结果:/n/r");
display(dst);
return 0;
}
09-24
09-24