/*The code to turn off all bulbs in a matrix of bulbs */ #include #include #include #include #define N 10000 typedef char ** MATRIX; typedef char * VECTOR; typedef char *const* CONST_MATRIX; typedef const char * CONST_VECTOR; MATRIX matrix_alloc2(int n, int m){ MATRIX x= (MATRIX)malloc(sizeof(char *)*n+sizeof(char)*n*m); int i; x[0]=(char *)(x+n); for(i=1;i0)sum^=in[i-1][j]; if(i0)sum^=in[i-1]; if(i=1)h[i][i-1]=1; h[i][i]=1; if(i0){ int delta=freedom_count; for(k=m-1,t=freedom_count-1;k>=0&&delta>0;k--){ if(k==freedom_index[t]){ int i; for(i=0;i0){ for(i=0;i=20)freedom_count=20;//do not search too much, so if the freedom_count is more than 15, the output may not be optimal long long u; int best_one_count=n*m+1; MATRIX bm=matrix_alloc2(n,m); for(u=0;u<1LL;u++)//calculate only one roots { MATRIX x=matrix_alloc2(n,m); vector_copy(x[n-1],ME,m); for(k=0;k=0;k--){ H_mul_vector(x[k],x[k+1],m); #ifdef _DEBUG printf("x[%d] 1:",k);vector_output(x[k],m);printf("\n"); #endif vector_sum(x[k],init[k+1],m); #ifdef _DEBUG printf("x[%d] 2:",k);vector_output(x[k],m);printf("\n"); #endif vector_sum(x[k],x[k+2],m); #ifdef _DEBUG printf("x[%d] 3:",k);vector_output(x[k],m);printf("\n"); #endif } copy_matrix_to_bit_string(x, m, n, any_root, longlong_len); matrix_free(x); } for(u=0;u=0;k--){ H_mul_vector(x[k],x[k+1],m); vector_sum(x[k],x[k+2],m); } copy_matrix_to_bit_string(x, m, n, base+u*longlong_len, longlong_len); matrix_free(x); } search_base_result(any_root, base, freedom_count, longlong_len); matrix_free(bm); free(freedom_index); free(any_root); free(base); } void parse(int argc, char **argv, int *pn,int *pm){ if(argc == 2){ int n = atoi(argv[1]); if(n<0||n>N){ Usage(argv[0]); }else if(n<=1){ printf("%d\n",n); exit(0); }else{ init=matrix_alloc(n); matrix_init_const(init,1,n,n); *pn=*pm=n; return; } }else if(argc==3){ int n = atoi(argv[1]); int m = atoi(argv[2]); if(n<0||n>N||m<0||m>N){ Usage(argv[0]); }else if(n<=1||m<=1){ printf("%d\n",n); exit(0); }else{ init=matrix_alloc2(n,m); matrix_init_const(init,1,n,m); *pn=n;*pm=m; return; } }else{ int n=argc-1; int i,j; int m=strlen(argv[1]); init=matrix_alloc2(n,m); for(i=0;i