//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include #include void inicializarGusanos(int **&mapa, int **&colisiones, int *M, int *N) { FILE *F=fopen("input.txt", "r"); fscanf(F,"%d%d",M, N); mapa=new int*[*M]; colisiones=new int*[*M]; for(int i=0;i<*M;i++) { mapa[i]=new int[*N]; colisiones[i]=new int[*N]; } for(int i=0;i<*M;i++) for(int j=0;j<*N;j++) { fscanf(F,"%d",&mapa[i][j]); colisiones[i][j]=0; } fclose(F); } bool esCabeza(int **mapa, int M, int N, int i, int j, int tipo) { switch(tipo) { case 1: return((i>=M-1) || mapa[i+1][j]!=mapa[i][j]); case 2: return((j<=0) || mapa[i][j-1]!=mapa[i][j]); case 3: return((i<=0) || mapa[i-1][j]!=mapa[i][j]); case 4: return((j>=N-1) || mapa[i][j+1]!=mapa[i][j]); } return false; } bool esCola(int **mapa, int M, int N, int i, int j, int tipo) { switch(tipo) { case 1: return esCabeza(mapa, M, N, i, j, 3); case 2: return esCabeza(mapa, M, N, i, j, 4); case 3: return esCabeza(mapa, M, N, i, j, 1); case 4: return esCabeza(mapa, M, N, i, j, 2); } return false; } bool avanzarParte(int **mapa, int **colisiones, int M, int N, int i, int j, int tipo) { if(mapa[i][j]!=tipo) return false; switch(tipo) { case 1://hacia abajo if (esCabeza(mapa, M, N, i, j, 1) && (i0)) { if(mapa[i][j-1]==0 && colisiones[i][j-1]==0)//simplemente avanzar mapa[i][j-1]=tipo; else//hay colision { colisiones[i][j-1]=1; mapa[i][j-1]=0; } } if(esCola(mapa, M, N, i, j, 2)) mapa[i][j]=0; break; case 3://hacia arriba if (esCabeza(mapa, M, N, i, j, 3) && (i>0)) { if(mapa[i-1][j]==0 && colisiones[i-1][j]==0)//simplemente avanzar mapa[i-1][j]=tipo; else//hay colision { colisiones[i-1][j]=1; mapa[i-1][j]=0; } } if(esCola(mapa, M, N, i, j, 3)) mapa[i][j]=0; break; case 4://hacia la derecha if (esCabeza(mapa, M, N, i, j, 4) && (j=0;i--) for(int j=N-1;j>=0;j--) { if(modificado) modificado=modificado; modificado=avanzarParte(mapa, colisiones, M, N, i, j, tipo)||modificado; } return modificado; } void generarCaso(int M, int N) { FILE *F=fopen("input.txt","w"); fprintf(F,"%d %d\n",M, N); for(int i=0;i