Está en la página 1de 8

PRACTICA6VISUALSTUDIOC++,IA

5. DESARROLLO
5.1 Para reservar memoria dinmica para matrices se siguen los siguientes
pasos: a. Se crea un puntero a punteros del tipo de datos: float **datos;
b. Se reserva memoria para el array de filas: datos = new float*[fil];
c. Se hace un bucle para reservar memoria para col columnas de cada fila: for
(int i=0;i<fil;i++) datos[i] = new float[col];
d. Creada la matriz, se puede trabajar con ella con los ndices y los corchetes [].
e. Finalmente, se debe hacer otro bucle para liberar la memoria de cada fila y la
asignada al vector de filas.
Ejecutar el siguiente programa:

5.2 Evaluar un polinomio de cualquier grado:


P(X)=a0+a1x+a2x2+a3x3++anxn
Como en un principio no se sabe de qu grado va a ser este polinomio, se debe
crear una variable puntero del tipo double:
double *coeficientes;
A continuacin se debe pedir el grado del polinomio y reservar memoria para el
array de coeficientes (utilizando el operador new). Luego, a travs de un bucle

se empezar a pedir los coeficientes del polinomio. Finalmente se debe pedir el


punto (x) en el que se va a evaluar el polinomio, cuyo resultado se sacar por la
consola. Tambin se debe sacar por la consola el polinomio que se ha evaluado.
La entrada y salida de datos por la consola podra ser:
>> Introduce el numero de coeficientes: 2
>> Introduce el coeficiente 1: 2.5
>> Introduce el coeficiente 2: 3.5
>> Introduce el valor de x: 2.0
>> El polinomio es: 2.5*X^0 + 3.5*X^1
>> El valor del polinomio en el punto 2.0 es 9.5
5.3. Desarrollar un programa que reciba el estado inicial y final, si el programa
lo puede resolver retorna la solucin al rompecabezas (emplee el programa del
anexo como referencia u otro)
5.4.
Describa detalladamente cada una de las funciones (subrutinas),
imprimiendo algunos resultados parciales.
5.4.
Ejecute el programa y graficar el rbol de estados (referencia figura
2),describir la solucin.
ANEXO:

INTELIGENCIAARTIFICIALCONVISUALC++(ESTRUCTURADO)
ROMPECABEZASDE8PIEZAS(PUZZLE)

/*Solucindelrompecabezasde8piezas*/

#include"stdafx.h"
#include<set>
#include<iostream>
#include<stdio.h>
#include<string>

usingnamespacestd;

structTnodo
{
stringedo;
inth;
intg;
charmca;
Tnodo*sig;
Tnodo*padre;
};

typedefstructTnodoTlista;

voidpinta_escenario(Tnodon);
voidpinta_estado(strings);
voidagrega_nodo(strings,stringm);
voidgenera_descendientes(stringm,stringp);
voidrecupera_mejores();

voidobtiene_mejor_nodo();
intpos(strings,charcs);
intpos_x(charc,strings);
intpos_y(charc,strings);
intdistancia_manhatan(strings,stringm);

Tlista*ppio,*ultimo,*mejor;

stringedo_i("12345678");
stringedo_m("45317268");

inttotal_nodos;

intmain(){
Tlista*nodo;
intj=0;
cout<<"Rompecabezasde8piezas"<<endl;
cout<<endl<<"Partimosdelestado"<<endl;
pinta_estado(edo_m);
cout<<endl<<"hastallegaralestado"<<endl;
pinta_estado(edo_i);
cout<<endl<<"Solucion"<<endl;
agrega_nodo(edo_i,edo_m);
while(mejor>h!=0){
obtiene_mejor_nodo();
nodo=mejor>padre;
if(nodo!=NULL){
genera_descendientes(mejor>edo,mejor>padre>edo);
}else{
genera_descendientes(mejor>edo,"0");
}
j++;
}
cout<<">Totaldeciclos="<<j<<endl;
cout<<">Totaldenodos="<<total_nodos<<endl<<endl;
recupera_mejores();
getchar();
return0;
}

voidpinta_escenario(Tnodonodo){
cout<<">Estado"<<endl;
pinta_estado(nodo.edo);
cout<<"h="<<nodo.h<<"g="<<nodo.g<<"f="<<nodo.g+nodo.h<<endl<<endl;
}

voidpinta_estado(stringedo){
cout<<edo[0]<<edo[1]<<edo[2]<<endl;
cout<<edo[3]<<edo[4]<<edo[5]<<endl;
cout<<edo[6]<<edo[7]<<edo[8]<<endl;
}

voidrecupera_mejores(){
Tlista*nodo;
nodo=mejor;
while(nodo){
pinta_escenario(*nodo);
nodo=nodo>padre;
}
}

voidagrega_nodo(strings,stringm){
Tlista*nodo=newTlista;
if(nodo==NULL){
cout<<"ERROR"<<endl;
}
else{
nodo>edo=string(s);
nodo>sig=NULL;
if(ppio==NULL){
nodo>mca='1';
nodo>g=0;
nodo>h=distancia_manhatan(s,m);
nodo>padre=NULL;
ppio=nodo;
ultimo=nodo;
mejor=nodo;
}else{
nodo>mca='0';
nodo>g=mejor>g+1;
nodo>h=distancia_manhatan(s,m);
nodo>padre=mejor;
ultimo>sig=nodo;
ultimo=nodo;
}
total_nodos+=1;
}
}

intdistancia_manhatan(stringescenario,stringmeta){
intsuma=0;
intx1,x2,y1,y2;
intdm=0;
for(charj=49;j<57;j++){
x1=pos_x(j,escenario);
y1=pos_y(j,escenario);
x2=pos_x(j,meta);
y2=pos_y(j,meta);
dm=abs(x1x2)+abs(y1y2);
suma=suma+dm;
}
returnsuma;
}

intpos_x(charpieza,stringescenario){
intv=0;
intcoordenadas_x[]={1,1,1,2,2,2,3,3,3};
intp=pos(escenario,pieza);
v=coordenadas_x[p];
returnv;
}

intpos_y(charpieza,stringescenario){
intv=0;
intcoordenadas_y[]={1,2,3,1,2,3,1,2,3};
intp=pos(escenario,pieza);
v=coordenadas_y[p];
returnv;
}

voidobtiene_mejor_nodo(){
intf=0;
intm=2000;
inth=0;
intnm=m;
Tlista*nodo;
nodo=ppio;
while(nodo){
f=nodo>h+nodo>g;
if(nodo>mca=='0'&&f<m){
m=f;
}
nodo=nodo>sig;
}
Tlista*nod;
nod=ppio;
while(nod){
f=nod>h+nod>g;
h=nod>h;
if(nod>mca=='0'&&f==m&&h<nm){
mejor=nod;
nm=h;
}
nod=nod>sig;
}
mejor>mca='1';
}

voidgenera_descendientes(stringmejor,stringpadre){
intc[5];
intb;
intj;
stringq;
b=pos(mejor,'');
q=string(mejor);
switch(b){

case0:c[0]=1;c[1]=3;c[2]=9;c[3]=9;break;
case1:c[0]=0;c[1]=2;c[2]=4;c[3]=9;break;
case2:c[0]=1;c[1]=5;c[2]=9;c[3]=9;break;
case3:c[0]=0;c[1]=4;c[2]=6;c[3]=9;break;
case4:c[0]=1;c[1]=3;c[2]=5;c[3]=7;c[4]=9;break;
case5:c[0]=2;c[1]=4;c[2]=8;c[3]=9;break;
case6:c[0]=3;c[1]=7;c[2]=9;c[3]=9;break;
case7:c[0]=4;c[1]=6;c[2]=8;c[3]=9;break;
case8:c[0]=5;c[1]=7;c[2]=9;c[3]=9;break;
}
for(j=0;c[j]!=9;j++){
q[b]=mejor[c[j]];
q[c[j]]='';
if(padre.compare(q)){
agrega_nodo(q,edo_m);
}
q=string(mejor);
}
}

intpos(strings,charca){
intc=0;
while(s[c]!=ca)c++;
returnc;
}