首页 > 代码库 > 沃尔夫勒姆自动机时空图输出 C语言实现
沃尔夫勒姆自动机时空图输出 C语言实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <conio.h> 5 6 7 //行宽度 8 #define ROW_LEN 38 9 10 11 //比特位域结构 12 typedef struct bits bits; 13 struct bits{ 14 15 unsigned int c0 : 1; 16 unsigned int c1 : 1; 17 unsigned int c2 : 1; 18 unsigned int c3 : 1; 19 unsigned int c4 : 1; 20 unsigned int c5 : 1; 21 unsigned int c6 : 1; 22 unsigned int c7 : 1; 23 }; 24 25 26 //行类型 27 typedef bits row[( ROW_LEN + 7 ) / 8]; 28 29 30 //读取行中元胞 31 unsigned int get_cell( row rw, int x ){ 32 33 unsigned int re = 0; 34 35 36 if( x < -1 || x > ROW_LEN ){ 37 38 puts( "get_cell: 坐标错误." ); 39 40 return re; 41 } 42 43 if( -1 == x ){ 44 45 x = ROW_LEN - 1; 46 } 47 48 if( ROW_LEN == x ){ 49 50 x = 0; 51 } 52 53 54 switch( x % 8 ){ 55 56 case 0:{ 57 58 re = rw[x / 8].c0; 59 }break; 60 61 case 1:{ 62 63 re = rw[x / 8].c1; 64 }break; 65 66 case 2:{ 67 68 re = rw[x / 8].c2; 69 }break; 70 71 case 3:{ 72 73 re = rw[x / 8].c3; 74 }break; 75 76 case 4:{ 77 78 re = rw[x / 8].c4; 79 }break; 80 81 case 5:{ 82 83 re = rw[x / 8].c5; 84 }break; 85 86 case 6:{ 87 88 re = rw[x / 8].c6; 89 }break; 90 91 case 7:{ 92 93 re = rw[x / 8].c7; 94 }break; 95 } 96 97 98 return re; 99 }100 101 102 //修改行中元胞103 void set_cell( row rw, int x, unsigned int v ){104 105 106 if( x < -1 || x > ROW_LEN ){107 108 puts( "set_cell: 坐标错误." );109 110 return;111 }112 113 if( -1 == x ){114 115 x = ROW_LEN - 1;116 }117 118 if( ROW_LEN == x ){119 120 x = 0;121 }122 123 124 v = v % 2;125 126 127 switch( x % 8 ){128 129 case 0:{130 131 rw[x / 8].c0 = v;132 }break;133 134 case 1:{135 136 rw[x / 8].c1 = v;137 }break;138 139 case 2:{140 141 rw[x / 8].c2 = v;142 }break;143 144 case 3:{145 146 rw[x / 8].c3 = v;147 }break;148 149 case 4:{150 151 rw[x / 8].c4 = v;152 }break;153 154 case 5:{155 156 rw[x / 8].c5 = v;157 }break;158 159 case 6:{160 161 rw[x / 8].c6 = v;162 }break;163 164 case 7:{165 166 rw[x / 8].c7 = v;167 }break;168 }169 }170 171 172 //演化行中元胞173 unsigned int evo_cell( row rw, int x, unsigned char tab ){174 175 unsigned char num = 0;176 177 178 if( x < 0 || x > ROW_LEN - 1 ){179 180 puts( "evo_cell: 坐标错误." );181 182 return 0;183 }184 185 186 num |= ( unsigned char )get_cell( rw, x - 1 );187 num <<= 1;188 num |= ( unsigned char )get_cell( rw, x );189 num <<= 1;190 num |= ( unsigned char )get_cell( rw, x + 1 );191 192 193 return ( tab >> num ) & 0x01;194 }195 196 197 //演化行到另外一个行198 void evo_row( row rw1, row rw2, unsigned char tab ){199 200 int x;201 202 203 for( x = 0; x < ROW_LEN; x++ ){204 205 set_cell( rw2, x, evo_cell( rw1, x, tab ) );206 }207 }208 209 210 //随机初始化行211 void rand_row( row rw ){212 213 int x;214 215 216 for( x = 0; x < ROW_LEN; x++ ){217 218 set_cell( rw, x, rand() % 2 );219 }220 }221 222 223 //显示行224 void display_row( row rw ){225 226 int x;227 228 229 for( x = 0; x < ROW_LEN; x++ ){230 231 printf( "%s", get_cell( rw, x ) ? "▉" : " " );232 }233 234 printf( "\n" );235 }236 237 238 239 //规则选择,这里选择为规则30,随机产生等腰三角形240 //这种自动机是一种随机数算法的根基241 #define TYPE_ID 30242 243 244 //主函数245 int main( int argc, char * argv[] ){246 247 row rw1, rw2;248 249 250 srand( ( unsigned int )time( NULL ) );251 252 rand_row( rw1 );253 254 255 while( 1 ){256 257 display_row( rw1 );258 259 _getch();260 261 evo_row( rw1, rw2, TYPE_ID );262 263 display_row( rw2 );264 265 _getch();266 267 evo_row( rw2, rw1, TYPE_ID );268 }269 270 return 0;271 }
运行效果:
沃尔夫勒姆自动机时空图输出 C语言实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。