Escolar Documentos
Profissional Documentos
Cultura Documentos
Índice de Contenidos
1. Problema 1 1
2. Problema 2 3
2.1. Programe un código que detecte si una relación R con la representación es cuasi-orden. 3
2.2. Demuestre que si R es cuasi-orden entonces la mayor relación de equivalencia conte-
nida dentro de esta es R ∩ R1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Programe un código que devuelva la mayor relación de equivalencia que esta contenida
en una relación que es cuasi-orden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. Problema 3 5
4. Problema 4 5
4.1. Considere un tablero de ajedrez de tamaño 2n x2n . Demuestre que ∀n ≥ 2, se pueden
poner a lo más 22n−1 caballos sin que se “coman” entre sí. . . . . . . . . . . . . . . . 5
4.2. Programe una función que, dado n, muestre en una matriz (1 donde hay caballos, 0
donde no) una posible forma de poner 22n−1 caballos en el tablero. . . . . . . . . . . 5
Lista de Figuras
Lista de Tablas
1. Problema 1
Sea V el conjunto de nombres de variable, C el conjunto de constantes numéricas y (,) el con-
junto de paréntesis. Definiremos inductivamente el conjunto ARIT de todas las posibles expresiones
aritméticas que usan las operaciones de suma y multiplicación de la siguiente manera:
Programe un cédigo que dado una secuencia de caracteres diga si es una expresión aritmética
del conjunto ARIT o no. En caso de que la respuesta sea afirmativa, muestre una sucesión de reglas
de la definición inductiva de ARIT que formen la expresión dada.
1 int main ( int argc , char ∗ argv [ ] ) {
2 while ( c i n ) {
3 s t r i n g exp ;
4 g e t l i n e ( c i n , exp ) ;
5 char r e s p [ exp . s i z e ( ) ] ;
6 s t r i n g prev=" " ;
7 int paren =0;
8 int i =0, j =0;
9 b o o l f l a g=t r u e ;
10 while ( i <exp . s i z e ( ) ) {
11 i f ( i s d i g i t ( exp [ i ] ) ) {
12 i f ( ! prev . compare ( " number " ) \
13 | | ! prev . compare ( " v a r i a b l e " ) ) {
14 f l a g=f a l s e ;
15 break ;
16 }
17 while ( i s d i g i t ( exp [ i ] ) ) i ++;
18 r e s p [ j ]= ’ a ’ ;
19 prev=" number " ;
20 }
21 e l s e i f ( exp [ i ]== ’ ( ’ | | exp [ i ]== ’ ) ’ ) {
22 i f ( exp [ i ]== ’ ( ’ ) {
23 paren++;
24 i f ( ! prev . compare ( " number " ) \
25 | | ! prev . compare ( " v a r i a b l e " ) ) {
26 f l a g=f a l s e ;
27 break ;
28 }
29 j −−;
30 }
31 i f ( exp [ i ]== ’ ) ’ ) {
32 paren −−;
33 i f ( ! prev . compare ( " op " ) ) {
34 f l a g=f a l s e ;
35 break ;
36 }
37 r e s p [ j ]= ’ c ’ ;
38 }
39 prev=" paren " ;
40 i ++;
41 i f ( paren <0){
42 f l a g=f a l s e ;
43 break ;
44 }
45 }
46 e l s e i f ( exp [ i ]== ’+ ’ | | exp [ i ]== ’ ∗ ’ ) {
47 i f ( ! prev . compare ( " op " ) \
48 | | ! prev . compare ( " " ) | | exp [ i −1]== ’ ( ’ ) {
49 f l a g=f a l s e ;
50 break ;
51 }
52 i f ( exp [ i ]== ’+ ’ ) {
53 r e s p [ j ]= ’ d ’ ;
54 }
55 i f ( exp [ i ]== ’ ∗ ’ ) {
56 r e s p [ j ]= ’ e ’ ;
57 }
58 prev=" op " ;
59 i ++;
60 }
61 else {
62 i f ( ! prev . compare ( " number " ) \
63 | | ! prev . compare ( " v a r i a b l e " ) ) {
64 f l a g=f a l s e ;
65 break ;
66 }
67 r e s p [ j ]= ’ b ’ ;
68 prev=" v a r i a b l e " ;
69 i ++;
70 }
71 j ++;
72 }
73 i f ( ! f l a g | | paren ! = 0 | | ! prev . compare ( " op " ) ) {
74 cout<<"NO"<<e n d l ;
75 }
76 else {
77 for ( int k=0;k<j −1;k++){
78 cout<<r e s p [ k]<< ’ , ’ ;
79 }
80 cout<<r e s p [ j −1]<<e n d l ;
81 }
82 }
83 }
Lista de Códigos Fuente 1: Ejercicio 1) en C++
2. Problema 2
Para representar una relación R sobre un conjunto finito A = a1 , .., an utilizamos una matriz
indicatriz, es decir, una matriz de nn tal que Aij = 1 si y solo si (ai , aj ) está en R. Una relación R
en A es cuasi-orden si es refleja y transitiva.
10 char r e s p [ n ] [ columnas + 1 ] ;
11 strcpy ( matriz [ 0 ] , l i n e a . c_str ( ) ) ;
12 for ( int i = 1 ; i < n ; i ++) {
13 g e t l i n e ( cin , l i n e a ) ;
14 strcpy ( matriz [ i ] , l i n e a . c_str ( ) ) ;
15 }
16 for ( int i =0; i <n ; i ++){
17 for ( int j =0; j <columnas +1; j ++){
18 i f ( m a t r i z [ i ] [ j ]== ’ ’ ) r e s p [ i ] [ j ]= ’ ’ ;
19 e l s e i f ( m a t r i z [ i ] [ j ]== m a t r i z [ j ] [ i ] \
20 && m a t r i z [ i ] [ j ]== ’ 1 ’ ) {
21 r e s p [ i ] [ j ]= ’ 1 ’ ;
22 }
23 e l s e i f ( m a t r i z [ i ] [ j ]== ’ 0 ’ ) r e s p [ i ] [ j ]= ’ 0 ’ ;
24 e l s e r e s p [ i ] [ j ]= m a t r i z [ i ] [ j ] ;
25 }
26 }
27 for ( int i =0; i <n ; i ++) {
28 string str ( resp [ i ] ) ;
29 cout<<s t r <<e n d l ;
30 }
31 }
Lista de Códigos Fuente 3: Ejercicio 2)c) en C++
3. Problema 3
4. Problema 4
4.1. Considere un tablero de ajedrez de tamaño 2n x2n . Demuestre
que ∀n ≥ 2, se pueden poner a lo más 22n−1 caballos sin que se
“coman” entre sí.
4.2. Programe una función que, dado n, muestre en una matriz (1
donde hay caballos, 0 donde no) una posible forma de poner
22n−1 caballos en el tablero.
Hay una manera muy simple de programar esta función. Primero sabemos que el tablero tendrá
2n · 2n = 22n . Además sabemos que si un caballo esta en una casilla blanca solo puede .atacarçasillas
negras. Es decir, si ponemos caballos en todas las casillas blancas no se comerán entre ellos. Lo
2n
mismo pasa si ponemos caballos solo en las casillas negras. Si hacemos esto pondremos 22 = 22n−1
caballos, lo que por la parte anterior es lo máximo de caballos que se pueden poner. Es decir, para
programar esto solo debemos ir saltándonos una casilla.
1 #include <b i t s / s t d c ++.h>
2 using namespace s t d ;
3
4 int main ( ) {
5 int n ;
6 c i n >>n ;
7 int tam=pow ( 2 . 0 , n ) ;
8 for ( int i =0; i <tam ; i ++){
9 for ( int j =0; j <tam ; j ++){
10 int k=i+j ;
11 i f ( j==tam−1) {
12 i f ( k %2==1)cout<< ’ 0 ’<<e n d l ;
13 e l s e i f ( k %2==0)cout<< ’ 1 ’<<e n d l ;
14 }
15 e l s e i f ( k %2==0) cout<< ’ 1 ’<< ’ ’ ;
16 e l s e i f ( k %2==1) cout<< ’ 0 ’<< ’ ’ ;
17 }
18
19 }
20 }
Lista de Códigos Fuente 4: Ejercicio 4) en C++