// quiver.cpp. #include #include #include #include #include using namespace std; int SizeOfMatrix,NumberOfRandomMutations,NumberOfAnswer,NumberOfMatrix,Matrix[40][40]; FILE* f, * file; char NameOfInput[100],NameOfOutput[100]; void copy_matrix(int M[40][40],int M1[40][40], int dim){ for(int i=1;i<=dim;i++) for(int j=1;j<=dim;j++) M1[i][j]=M[i][j]; } void read_matrix(){ fscanf(file,"%d ",&SizeOfMatrix); for(int i=1;i<=SizeOfMatrix;i++) for(int j=1;j<=SizeOfMatrix;j++) fscanf(file,"%d ",&Matrix[i][j]); } void print_matrix(){ f=fopen(NameOfOutput,"a"); fprintf(f,"\n \n SizeOfMatrix=%d \n NumberOfMatrix=%d \n Matrix= " , SizeOfMatrix,NumberOfMatrix); for(int i=1;i<=SizeOfMatrix;i++){ fprintf(f," \n "); for(int j=1;j<=SizeOfMatrix;j++) if(Matrix[i][j]>=0) fprintf(f," %d",Matrix[i][j]); else fprintf(f," %d",Matrix[i][j]); } fclose(f); } void print_last_line(int M1[40][40]){ f=fopen(NameOfOutput,"a"); if(NumberOfAnswer==1) fprintf(f,"\n \n SizeOfMatrix NumberOfMatrix NewValencies "); if(NumberOfAnswer<10) fprintf(f,"\n %d %d %d " , NumberOfAnswer,SizeOfMatrix,NumberOfMatrix); else fprintf(f,"\n %d %d %d " , NumberOfAnswer,SizeOfMatrix,NumberOfMatrix); for(int i=1;i<=SizeOfMatrix;i++) if(M1[SizeOfMatrix+1][i]>=0) fprintf(f," %d",M1[SizeOfMatrix+1][i]); else fprintf(f," %d",M1[SizeOfMatrix+1][i]); fclose(f); } int sgn(int a){ if(a>0) return 1; if(a==0) return 0; if(a<0) return -1; } void mutation(int M1[40][40],int k){ int M2[40][40]; copy_matrix(M1,M2,SizeOfMatrix+1); for(int i=1;i<=SizeOfMatrix+1;i++) for(int j=1;j<=SizeOfMatrix+1;j++) M1[i][j]=-M2[i][j]*(1-abs(sgn((i-k)*(j-k))))+(M2[i][j]+sgn(M2[i][k])*max(0,M2[i][k]*M2[k][j]))*abs(sgn((i-k)*(j-k))); } bool is_infinite(){ int k,M1[40][40]; copy_matrix(Matrix,M1,SizeOfMatrix+1); for(int i=1;i<=NumberOfRandomMutations;i++){ k=(rand() % (SizeOfMatrix+1))+1; mutation(M1,k); for(int i=1;i<=SizeOfMatrix+1;i++) for(int j=1;j<=SizeOfMatrix+1;j++) if(abs(M1[i][j])>2) return true; } return false; } void attach(int end_ ){ for(int i=-2;i<=2;i++){ Matrix[SizeOfMatrix+1][end_]=i; Matrix[end_][SizeOfMatrix+1]=-i; if(end_>1) attach(end_-1); else { Matrix[SizeOfMatrix+1][SizeOfMatrix+1]=0; if(!is_infinite()){ NumberOfAnswer++; print_last_line(Matrix); } } } } int main(){ NumberOfRandomMutations=3000; printf("\nPrint input filename: "); scanf("%s", NameOfInput); file=fopen(NameOfInput,"r"); printf("\nPrint output filename: "); scanf("%s", NameOfOutput); f=fopen(NameOfOutput,"w"); fclose(f); NumberOfMatrix=0; while (!feof(file)){ NumberOfAnswer=0; read_matrix(); NumberOfMatrix++; print_matrix(); attach(SizeOfMatrix); } fclose(file); printf("Finished"); return 0; }