//--------------------------------------------------------------------------- #include #include //--------------------------------------------------------------------------- const int vecindad[] = { -1,0, /// NORTE 0,1, /// ESTE 1,0, /// SUR 0,-1 /// OESTE }; const int numVecindad = 4; const int MUCHO = 1000000; //--------------------------------------------------------------------------- /* void checaCasilla(int **altura,int **flujo,int ren,int col,int posRen, int posCol) { int min,i,newRen,newCol; flujo[posRen][posCol] = -1; min = MUCHO; for(i = 0; i < numVecindad; i++) { newRen = posRen + vecindad[2*i]; newCol = posCol + vecindad[2*i + 1]; if( 0 <= newRen && newRen < ren && 0 <= newCol && newCol < col ) { if( altura[newRen][newCol] < altura[posRen][posCol] && altura[newRen][newCol] < min ) { min = altura[newRen][newCol]; flujo[posRen][posCol] = i; } } } } //--------------------------------------------------------------------------- void generadorAleatorio(int posRen,int posCol) { FILE *input; FILE *output; int i,j,ren,col,**flujo,**altura; input = fopen("caso5.txt","r+t"); fscanf(input,"%d %d",&ren,&col); flujo = new int*[ren]; altura = new int*[ren]; for(i = 0; i < ren; i++) { flujo[i] = new int[col]; altura[i] = new int[col]; for(j = 0; j < col; j++) fscanf(input,"%d",&altura[i][j]); } fclose(input); for(i = 0; i < ren; i++) { for(j = 0; j < col; j++) checaCasilla(altura,flujo,ren,col,i,j); } output = fopen("input5.txt","w+t"); fprintf(output,"%d %d %d %d\n",ren,col,posRen,posCol); for(i = 0; i < ren; i++) { for(j = 0; j < col; j++) fprintf(output,"%d ",flujo[i][j]); fprintf(output,"\n"); } fclose(output); for(i = 0; i < ren; i++) { delete[] flujo[i]; delete[] altura[i]; } delete[] flujo; delete[] altura; } */ //--------------------------------------------------------------------------- void ascenso(int **matriz,int **flujo,int ren,int col,int posRen,int posCol) { int i,newRen,newCol; /// Terminamos si nos salimos de la matriz. if( 0 > posRen || posRen >= ren || 0 > posCol || posCol >= col ) return; matriz[posRen][posCol] = 1; for(i = 0; i < numVecindad; i++) { newRen = posRen + vecindad[2*i]; newCol = posCol + vecindad[2*i + 1]; if( 0 <= newRen && newRen < ren && 0 <= newCol && posCol < col ) { if( flujo[newRen][newCol] == (i+2)%4 ) ascenso(matriz,flujo,ren,col,newRen,newCol); } } } //--------------------------------------------------------------------------- void descenso(int **matriz,int **flujo,int ren,int col,int posRen,int posCol) { /// Terminamos si nos salimos de la matriz. if( 0 > posRen || posRen >= ren || 0 > posCol || posCol >= col ) return; matriz[posRen][posCol] = 1; /// Terminamos si el flujo es -1 if( flujo[posRen][posCol] == -1 ) { // revisamos todos los que llegan al pozo. ascenso(matriz,flujo,ren,col,posRen,posCol); return; } /// Nos desplazamos a la direccion que nos indica el flujo en donde estamos /// parados. descenso(matriz,flujo,ren,col,posRen + vecindad[2*flujo[posRen][posCol]],posCol + vecindad[2*flujo[posRen][posCol] + 1]); } //--------------------------------------------------------------------------- int main(void) { //generadorAleatorio(5,5); FILE *input,*output; int i,j,ren,col,posRen,posCol,**matriz,**flujo; input = fopen("input.txt","r+t"); fscanf(input,"%d %d %d %d",&ren,&col,&posRen,&posCol); matriz = new int*[ren]; flujo = new int*[ren]; for(i = 0; i < ren; i++) { matriz[i] = new int[col]; flujo[i] = new int[col]; for(j = 0; j < col; j++) { matriz[i][j] = 0; fscanf(input,"%d",&flujo[i][j]); } } fclose(input); descenso(matriz,flujo,ren,col,posRen,posCol); output = fopen("output.txt","w+t"); for(i = 0; i < ren; i++) { for(j = 0; j < col; j++) fprintf(output,"%d ",matriz[i][j]); fprintf(output,"\n"); } fclose(output); for(i = 0; i < ren; i++) { delete[] matriz[i]; delete[] flujo[i]; } delete[] matriz; delete[] flujo; return 0; } //---------------------------------------------------------------------------