Soluciones Nacional Inter politécnicas Tlaxcala 2013

Nacional Inter politécnicas Tlaxcala 2013

Les comparto las soluciones de los problemas, en cuanto este los problemas en la pagina oficial, les comparto la liga.

Problema A

/*
Problema: A , solucion alterna
Autor: Rodrigo Burgos Dominguez
*/
# include <stdio.h>
# include <string.h>

int map[10][10];

int min(int a, int b){ return a < b ? a: b; }
int max(int a, int b){ return a > b ? a: b; }
int abso( int a ){ return a < 0 ? -a : a; }

int distance( int a, int b, int x, int y ){
    return  max( abso( a - x ) , abso( b - y ) );
}

int getDistance( int a, int b){
  int x, y, r = (1<<22);
  for( x = 1; x <= 8; x++)
  for( y = 1; y <= 8; y++)
    if( map[x][y] == 1)
       	r = min(r, distance(a, b, x, y));
   return r;
}

main(){
  int ncases, cases, x, y, mx, my, ly, lx, dm, dl;
  for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
     for( x = 1; x <= 8; x++)	
     for( y = 1; y <= 8; y++)
       scanf("%d", &map[x][y]);
     scanf("%d %d", &mx, &my);
     scanf("%d %d", &lx, &ly);
     dm = getDistance( mx, my);
     dl = getDistance( lx, ly);
     printf("%s %d\n", ( dm < dl ? "Mario" : ( dm > dl ? "Luigi" : "Ambos")) , min( dm, dl ) );
  }
  return 0;	
}

Problema B

/*
  Problema: Sokoban
  Concurso: CONPI
  Autor: Rodrigo Burgos Dominguez
*/

# include <stdio.h>
# include <string.h>

int queue[1000000*2][7], N, nqueue;
char vis[10][10][10][10][10][10], map[11][11];
int nbox, boxx[2], boxy[2];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};

void insert(int srow, int scol, int brow, int bcol, int bdrow, int bdcol, int distance){
  if( vis[srow][scol][brow][bcol][bdrow][bdcol] == 1 ) return;
  vis[srow][scol][brow][bcol][bdrow][bdcol] = 1;
  queue[nqueue][ 0 ] = srow;
  queue[nqueue][ 1 ] = scol;
  queue[nqueue][ 2 ] = brow;
  queue[nqueue][ 3 ] = bcol;
  queue[nqueue][ 4 ] = bdrow;
  queue[nqueue][ 5 ] = bdcol;
  queue[nqueue][ 6 ] = distance;
  nqueue++;
}

int move( int dir, int sr, int sc, int br, int bc, int bdr, int bdc, int dis){
   if( map[sr][sc] != '#'){
   	  if( sr == br && sc == bc ){
   	     br += dx[dir];
   	     bc += dy[dir];
   	     if( map[br][bc] == '#' || ( br == bdr && bc == bdc ) ) return 0;
   	     insert( sr, sc, br, bc, bdr, bdc, dis);	
   	     return 1;
   	  }else
   	    if(sr == bdr && sc == bdc ){
	   	     bdr += dx[dir];
	   	     bdc += dy[dir];
	   	     if( map[bdr][bdc] == '#' || ( br == bdr && bc == bdc ) ) return 0;
	   	     insert( sr, sc, br, bc, bdr, bdc, dis);	
	   	     return 1;
	   	  }else{
	   	     insert( sr, sc, br, bc, bdr, bdc, dis);	
	   	     return 1;
	   	  }
   }
   return 0;
}

int solve(int sr, int sc){
  int dis, br, bc, bdr, bdc, next, dir;
  memset( vis, 0, sizeof(vis)); 
  nqueue = 0;
  insert( sr, sc, boxx[0], boxy[0], boxx[1], boxy[1], 0);
  for(next = 0; next < nqueue ; next++){
  	 sr = queue[next][0];
  	 sc = queue[next][1];
  	 br = queue[next][2];
  	 bc = queue[next][3];
  	 bdr = queue[next][4];
  	 bdc = queue[next][5];
  	 dis = queue[next][6];
  	 if( map[br][bc] == '*' && ( nbox < 2 || map[bdr][bdc] == '*')){
  	    return dis;
  	 }
  	 for( dir = 0; dir < 4; dir++)
  	   move( dir, sr + dx[dir], sc + dy[ dir ], br, bc,  bdr, bdc, dis + 1);	
  }
  return -1;
}

main(){
  int x, y, ncases, cases, sr, sc;
  for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
     scanf("%d", &N);	
     for( x = 0; x < N; x++) scanf("%s", map[x]);
     nbox = 0;
     memset( boxx , 0, sizeof( boxx ));
     memset( boxy , 0, sizeof( boxy ));
     for( x = 0; x < N; x++)
     for( y = 0; y < N; y++){
       if( map[x][y] == '$' || map[x][y] == '@'){
           boxx[nbox] = x;
           boxy[nbox] = y;
           nbox++;
           map[x][y] = ( map[x][y] == '@' ) ? '*' : '.';
       }
       if( map[x][y] == 's'){
         sr = x;
         sc = y;	
       }
     }
     printf( "%d\n", solve(sr, sc) );
  }
  return 0;	
}

Problema C

/*
Problema C: Solucion alterna
Autor: Rodrigo Burgos Dominguez
*/

# include <stdio.h>
# include <string.h>

int ataque[10], position[10];
int defensa[10];

int gana( int a, int d, int A, int D){
   if( a - 5 >= A) return 1;
   if( A - 5 >= a) return 0;
   if( d - 15 >= D) return 1;
   if( D - 15 >= d) return 0;
   return (a + d) - (A + D) >= 50;
}

main(){
  int cases, ncases, x, y;
  for( scanf("%d", &ncases) , cases = 1; cases <= ncases ; cases++){
    for( x = 0; x < 8; x++ ) scanf("%d", &ataque[x]);
    for( x = 0; x < 8; x++ ) scanf("%d", &defensa[x]);
    for( x = 0; x < 8; x++) position[x] = x;
    for( x = 8; x > 1; x /= 2){
      for( y = 0; y < x ; y+=2){
         position[y/2] = ( gana( ataque[position[y]] , defensa[ position[ y ] ], ataque[position[y + 1]] , defensa[ position[ y + 1] ]) == 1 ) ? position[ y ] : position[ y + 1]; 
         }
      }
    printf("%d\n", position[ 0 ]+1);
  }
  return 0;
}

Problema D

/*
Problema D: Solucion Alterna
Autor: Rodrigo Burgos Dominguez
*/
# include <stdio.h>
# include <string.h>

int hash[256];
char line[10000];

main(){
  int ncases, cases, x;
  double costR, costC, costT, total;
  for( gets(line), sscanf(line, "%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
     gets(line); sscanf(line, "%lf %lf %lf", &costR, &costC, &costT);	
     memset( hash, 0, sizeof( hash ));
     gets(line); 
     for( x =0; x < strlen(line) ; x++) hash[ line[x] ]++;
     gets(line); 
     for( x =0; x < strlen(line) ; x++) hash[ line[x] ]++;
     total = (double)hash['R']*costR*.2;
     total+= (double)hash['C']*costC*.3;
     total+= (double)hash['T']*costT*.4;
     
     total -= ((double)hash['B']*1.0);
     total -= ((double)hash['P']*2.0);
     total -= ((double)hash['H']*1.5);
     printf("%s\n%.1lf\n", (total <= 0 ? "Pierde" : "Gana"), total);
  }
  return 0;	
}

Problema E

/*
Autor: Rodrigo Burgos Dominguez
*/
# include <stdio.h>
# include <string.h>

int prime[100], nprime;
int c[100];

long long min(long long a, long long b){ return a < b ? a : b; }

long long count(int n, int p){
    long long r, cnt = 0;
    for( r = p; r <= (long long)n; r *= (long long)p)
      cnt += n / r;
    return cnt;
}

main(){
  int x, y, n, base, cases, ncases, cont;
  long long sol, t;
  nprime = 0;
  for( x = 2; x <= 36; x++)
    if(c[x] == 0 )
     for( prime[nprime++] = x,  y = 2*x ; y <= 36 ; y += x) c[ y ] = 1;
  for( scanf("%d", &ncases), cases = 1 ; cases <= ncases ; cases++ ){
     scanf("%d %d", &n, &base);
     sol = -1;
     for( x = 0; x < nprime && prime[x] <= base ; x++){
     	for(cont = 0; base % prime[ x ] == 0 ; cont++){
     		base /= prime[x];
     	}
     	if( cont > 0 ){
     	   t = count(n, prime[x]) / (long long)cont;
     	   if( sol == -1) sol = t;
     	   sol = min( sol, t);
     	}
     }	
     printf("%lld\n", sol);
  }
  return 0;	
}

Problema F

/*
Problema F: Solucion Alterna
Autor: Rodrigo Burgos Dominguez
*/
# include <stdio.h>
# include <string.h>

int sol[11][11], mat[11][11];

main(){
  int ncases, cases, n, x, y, k, same;
  for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
  	scanf("%d", &n);
  	for( x = 0; x < n; x++)
  	for( y = 0; y < n; y++)
  	  scanf("%d", &mat[x][y]);
  	same = 1;
    for( x = 0; x < n; x++)
    for( y = 0; y < n; y++){
       sol[x][y] = 0;
       for( k = 0; k < n; k++)
         sol[x][y] += mat[x][k]*mat[k][y];
       if( sol[x][y] != mat[x][y]) same = 0;
    }
    for( x = 0; x < n; x++){
      for( y = 0; y < n; y++){
        if(y != 0) printf(" ");
      	 printf("%d", sol[x][y]);
      }
      printf("\n");
    }
    printf("%d\n", same);
  }
  return 0;	
}

Problema G

/*
Autor: Rodrigo Burgos Dominguez
*/
# include <stdio.h>
# include <string.h>

# define MAX_ROW 30

int n, m;
char tablero[MAX_ROW+1][MAX_ROW+1];
int mark[MAX_ROW+1][MAX_ROW+1][2];
char vis[MAX_ROW+1][MAX_ROW+1];

int dr[8] = {1, 1, -1, -1, 2, 2, -2, -2};
int dc[8] = {2, -2, 2, -2, 1, -1, 1, -1};

int match( int row, int col){
   int r, c, dir;
   if( vis[row][col] == 1) return 0;
   vis[row][col] = 1;
   for( dir = 0; dir < 8; dir++){
      r = row + dr[dir];	
      c = col + dc[dir];
      if( r < 0 || r >= n || c < 0 || c >= m ) continue;
      if( tablero[r][c] == '.' && (  mark[r][c][0] == -1 || match( mark[r][c][0], mark[r][c][1] ) ) ){
      	  mark[r][c][0] = row;
      	  mark[r][c][1] = col; 
      	  mark[row][col][0] = r;
      	  mark[row][col][1] = c; 
      	  return 1;
      }
   }
   return 0;
}

main(){
  int ncases, cases, sol, x, y, contDots;
  for(scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++){
  	scanf("%d %d", &n, &m);
  	contDots = 0;
  	for(x = 0; x < n; x++){
  	  scanf("%s", tablero[ x ]);
  	  for( y = 0; y < m; y++)
  	    if(tablero[x][y] == '.') contDots++;
  	}
  	memset( mark , -1, sizeof( mark ));
  	sol = 0;
  	for( x = 0; x < n; x++)
  	for( y = 0; y < m; y++) 
  	  if(mark[x][y][0] == -1 && tablero[x][y] == '.'){
  	      memset( vis, 0, sizeof( vis ));
  	      if( match( x , y ) ) sol++;
  	  }
  	printf("%d\n", contDots - sol);
  }
  return 0;	
}

Deja un comentario