<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Helton Duarte &#187; Programando Melhor</title>
	<atom:link href="http://heltonduarte.com/category/cursos/programando-melhor/feed/" rel="self" type="application/rss+xml" />
	<link>http://heltonduarte.com</link>
	<description>O seu espaço sobre programação</description>
	<lastBuildDate>Fri, 15 Jul 2011 18:38:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Programando melhor: Aula 8 &#8211; Grafos III</title>
		<link>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/</link>
		<comments>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/#comments</comments>
		<pubDate>Mon, 04 May 2009 19:59:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[árvore geradora mínima]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[floyd-warshall]]></category>
		<category><![CDATA[grafos]]></category>
		<category><![CDATA[prim]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=175</guid>
		<description><![CDATA[Aula 8 - Grafos III
Conteúdo: Apresentação de mais alguns conceitos da teoria dos grafos, assim como algoritmos para resolução da Árvore Geradora Mínima e do menor caminho em um grafo valorado.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Hoje teremos a última parte da aula de grafos (foi dividida em 3), sendo também nossa aula final antes da <strong>2ª fase</strong> da <a title="OBI 2009" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a>. Contudo, o curso <strong>Programando Melhor</strong> não irá terminar, ele continuará presente no blog, com a apresentação futura de tópicos sobre <strong>Programação Dinâmica</strong> e alguns assuntos interessantes, conforme eu for descobrindo, ok? Além disso, o blog voltará a ter <strong>posts sobre assuntos variados</strong>, envolvendo a área de TI em geral, não sendo focado apenas para a parte de Programação (contudo a maioria ainda será de programação, por ser minha <em>&#8220;especialidade&#8221;</em>).</p>
<p><strong>Aula 8 &#8211; Grafos III</strong></p>
<p><strong>Conteúdo: </strong><em>Apresentação de mais alguns conceitos da teoria dos grafos, assim como algoritmos para resolução da Árvore Geradora Mínima e do menor caminho em um grafo valorado.</em></p>
<p><strong>Teoria dos grafos</strong> é o estudo das propriedades das estruturas feitas com grafos. Com ela (a teoria) é possível ter uma linguagem comum ao tratar desse assunto, sendo <strong>a chave para resolver muitos problemas</strong> o fato de identificar esses conceitos fundamentais e implementar algoritmos clássicos para resolvê-los.</p>
<p><strong>Propriedades dos graus</strong></p>
<p>A propriedade mais simples de um vértice é seu <strong>grau</strong>, ou seja, a quantidade de arestas que incidem sobre ele. Existem diversas propriedades importantes do grau de um vértice, como a <em>soma de todos os graus ser igual ao dobro do número de arestas</em>, pelo fato desta contribuir para o grau de vértices adjacentes. Uma consequência disso é que<strong> qualquer grafo possui um número par de vértices com grau ímpar</strong>.</p>
<p><strong>Árvores</strong> são grafos indiretos que não contém ciclos. Os graus dos vértices são importantes para a análise de árvores. A <em>folha</em> de uma árvore é um vértice com grau 1. Cada grupo de <em>n</em> vértices, contém n-1 arestas, portanto uma árvore possui no mínimo duas folhas. Ao retirar uma folha diminui-se a árvore, sem disconectá-la.</p>
<p>Uma <strong>árvore geradora</strong> de um grafo <em>G = (V, E)</em> é um subconjunto de arestas <em>E&#8217;</em> contido em <em>E</em>, tal que<em> E&#8217;</em> é uma árvore com os vértices <em>V</em>. Esse tipo de árvore existe para qualquer <strong>grafo conexo</strong> (com todos os vértices ligados entre si por algum caminho) e é visto pela relação estabelecida no vetor<em> parent[ ]</em>, em <strong>buscas em largura</strong> e <strong>profundidade</strong>.</p>
<p><strong>Árvore Geradora Mínima</strong></p>
<p>Utilizada em grafos valorados, a <em>árvore geradora mínima</em> consiste em buscar a <em>árvore geradora</em> que possui a menor soma dos valores de suas arestas. São a resposta ao tratarmos de problemas sempre que precisarmos ligar um conjunto de pontos pela menor quantidade de canos, fios, etc.</p>
<p>Há dois algoritmos principais para tratar de árvores geradoras mínimas, o de <strong>Kruskal </strong>e o de <strong>Prim</strong>, contudo irei abordar aqui apenas o segundo, por ser mais simples e nos dar uma ótima base para enterder o menor caminho de <strong>Dijkstra</strong>, a seguir.</p>
<p>Primeiramente, generalizaresmos a estrutura de grafos implantada nas aulas anteriores, para utilizarmos grafos valorados.</p>
<p>typedef struct {</p>
<p>int v;            /* vértice adjacente */</p>
<p>int valor;    /* valor da aresta */</p>
<p>} aresta;</p>
<p>typedef struct {</p>
<p>edge edges[MAXV+1][MAXGRAU];    /* informação de adjacência */</p>
<p>int grau[MAXV+1];                                    /* grau de cada vértice */</p>
<p>int nvertices;                                                /* número de vértices no grafo */</p>
<p>int narestas;                                                  /* número de arestas no grafo */</p>
<p>} grafo;</p>
<p><strong>OBS: </strong>lembrando também de ajeitar a inicialização e as buscas apropriadamente, o que não é trabalho complicado.</p>
<p>O <strong>algoritmo de Prim</strong> começa de um vértice inicial e a cada iteração é adicionado um novo vértice na árvore geradora, ligando sempre o menor valor de um vértice dentro da árvore para um vértice fora. A implementação abaixo mantém todas as arestas dos vértices já inclusos na árvore para vértices não-inclusos, sendo o menor incluído na próxima iteração.</p>
<p>prim (grafo *g, int start)<br />
{<br />
int i;      /* contador */<br />
bool intree[MAXV];           /* esse vértice está na árvore? */<br />
int distance[MAXV];          /* distância do vértice ao start */<br />
int v;                       /* vértice atual para ser processado */<br />
int w;                       /* candidato para próximo vértice */<br />
int weight;                  /* valor da aresta */<br />
int dist;                    /* menor distância atual */</p>
<p>for (i=1; i&lt;g-&gt;nvertices; i++)<br />
{<br />
intree[i] = FALSE;<br />
distance[i] = MAXINT;<br />
parent[i] = -1;<br />
}</p>
<p>distance[start] = 0;<br />
v = start;</p>
<p>while (intree[v] == FALSE) {<br />
intree[v] = TRUE;</p>
<p>for (i=0; i&lt;g-&gt;nvertices; i++)<br />
{<br />
w = g-&gt;edges[v][i].v;<br />
weight = g-&gt;edges[v][i].weight;</p>
<p>if ((distance[w] &gt; weight) &amp;&amp; (intree[w] == FALSE))<br />
{<br />
distance[w] = weight;<br />
parent[w] = v;<br />
}<br />
}</p>
<p>v = 1;<br />
dist = MAXINT;</p>
<p>for (i=2; i&lt;=g-&gt;nvertices; i++)<br />
{<br />
if ((intree[i] == FALSE) &amp;&amp; (dist &gt; distance[i]))<br />
{<br />
dist = distance[i];<br />
v = i;<br />
}<br />
}<br />
}<br />
}</p>
<p>Algumas <strong>alterações</strong> nesse método podem (e normalmente devem) ser feitas, de acordo com a necessidade do problema, como <strong>imprimir cada aresta</strong>, à medida que são encontradas ou <strong>armazenar o valor da soma de todas as arestas da árvore,</strong> para retornar no final. Ou seja, foi dado o queijo e a faca para vocês, resta saberem cortá-lo. Algumas variações são, por exemplo, a <strong>árvore geradora máxima</strong> (sendo preciso apenas deixar os valores das arestas negativos), <strong>árvore com menor produto possível das arestas</strong> (substituindo o valor da aresta pelo seu logaritmo).</p>
<p><strong>Menor caminho</strong></p>
<p>O problema de encontrar o menor caminho em grafos não-valorados, já foi discutido na aula anterior, sendo apenas necessário o uso de uma <strong>busca em largura</strong>, no entanto hoje iremos mostrar um algoritmo básico (e eficiente) para tratar desses &#8220;novos tipos de grafos&#8221;:  <a title="Algoritmos para Grafos: Dijkstra - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/dijkstra.html" target="_blank">Dijkstra</a>.</p>
<p><a title="Algoritmos em Grafos - IME/USP" href="http://www.ime.usp.br/~coelho/mac328/pf/floyd.html" target="_blank">Floyd-Warshall</a> é outra opção, mas já fora tratado no aula de <a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Revisão</a> para a primeira fase da <a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a>, nesse blog, com a aplicação no problema <a title="Batuíra - OBI" href="http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/batuira" target="_blank">Batuíra</a>, da seção pratique do site da <em>Olimpíada Brasileira de Informática</em> e, portanto, não será mais abordado (deem uma olhada no post de Revisão para entender o código).<a title="Algoritmos em Grafos - IME/USP" href="http://www.ime.usp.br/~coelho/mac328/pf/floyd.html" target="_blank"><em></em></a></p>
<p>O <strong>algoritmo de Dijkstra</strong> é um método para encontrar o menor caminho entre dois vértices de um grafo valorado. Dado um vértice particular <em>s</em>, ele encontrará o menor caminho de <em>s</em> para qualquer outro vértice do grafo, incluindo o seu destino<em> t</em>.</p>
<p>A idéia é praticamente igual a de <strong>Prim</strong>, na<em> árvore geradora mínima</em>. A diferença entre eles é como comparar se o próximo vértice é o desejável. No menor caminho nós buscamos o vértice em que a distância até o atual MAIS o seu valor será menor do que o comparado, ou seja:</p>
<p>if (distance[w] &gt; (distance[v]+weight)) {</p>
<p>distance[w] = distance[v] + weight;</p>
<p>parent[w] = v;</p>
<p>}</p>
<p>Ao contrário do algoritmo de <em>Prim</em>, <strong>Dijkstra</strong> <strong>não pode trabalhar com valores negativos</strong>, porém esse problema é insignificante, já que não há aplicação prática para tais valores.<strong> Não se esqueça de exercitar</strong>:</p>
<ul>
<li><a title="Freckles" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10034.html" target="_blank">Freckles &#8211; Nível 2</a></li>
<li><a title="The Necklace" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10054.html" target="_blank">The Necklace &#8211; Nível 3</a></li>
<li><a title="Fire Station" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10278.html" target="_blank">Fire Station &#8211; Nível 2</a></li>
<li><a title="Railroads" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10039.html" target="_blank">Railroads &#8211; Nível 3</a></li>
<li><a title="War" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=onlinejudge&amp;page=show_problem&amp;problem=1099" target="_blank">War &#8211; Nível 3</a></li>
<li><a title="Tourist Guide" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=onlinejudge&amp;page=show_problem&amp;problem=1140" target="_blank">Tourist Guide &#8211; Nível 3</a></li>
<li><a title="The Grand Dinner" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=14&amp;page=show_problem&amp;problem=1190" target="_blank">The Grand Dinner &#8211; Nível 4</a></li>
<li><a title="The Problem With the Problem Setter" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=12&amp;page=show_problem&amp;problem=1033" target="_blank">The Problem With the Problem Setter &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p>Com isso, terminamos nossas dicas antes da <strong>2ª fase da OBI</strong>, o que posso fazer agora é desejá-los <strong>boa prova</strong> e que <strong>Deus vos abençoe.</strong> Atentem principalmente para os assuntos dos posts recomendados a seguir:</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Backtracking</a></li>
<li><a title="Aula 6 - Grafos I" href="http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/" target="_blank">Programando melhor: Aula 6 &#8211; Grafos I</a></li>
<li><a title="Aula 7 - Grafos II" href="http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/" target="_blank">Programando melhor: Aula 7 &#8211; Grafos II</a></li>
</ul>
<p><em>Vamos lá, estamos na reta FINAL! <strong>Comentem</strong> e tirem suas dúvidas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Os preceitos do SENHOR são retos e alegram o coração; o mandamento do SENHOR é puro e alumia os olhos.&#8221;</em> <strong>Salmos 19.8</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/05/04/programando-melhor-aula-8-grafos-iii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 7 &#8211; Grafos II</title>
		<link>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/</link>
		<comments>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 15:33:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[bfs]]></category>
		<category><![CDATA[dfs]]></category>
		<category><![CDATA[OBI]]></category>
		<category><![CDATA[Programming Challenges]]></category>
		<category><![CDATA[UVa Online Judge]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=173</guid>
		<description><![CDATA[Aula 7 - Grafos II
Conteúdo: Aprofundamento com as buscas em largura e profundidade em um grafo, além do menor caminho em grafos não-valorados.]]></description>
			<content:encoded><![CDATA[<p><em>Estou de volta!</em></p>
<p>Como esperado por muitos, o resultado da <a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a> saiu completamente ontem. Para o <strong>RN</strong> o resultado foi bom na categoria <strong>iniciação (mais de 100 aprovados)</strong>, porém deixou a desejar na de <strong>Programação, tendo 2 aprovados em Júnior, 1 no nível 1 e 5 no nível 2</strong>. Como continuação do nosso preparo para a segunda fase da competição, teremos hoje a segunda aula sobre Grafos!</p>
<p><strong>Aula 7 &#8211; Grafos II</strong></p>
<p><strong>Conteúdo:<em> </em></strong><em>Aprofundamento com as buscas em largura e profundidade em um grafo, além do menor caminho em grafos não-valorados.</em></p>
<p>A operação básica na maioria dos grafos é percorrê-lo completamente e sistematicamente. É preciso visitar cada vértice e cada aresta exatamente uma vez em uma ordem pré-definida. Existem dois tipos primordiais de algoritmos para realizar essa atividade: <strong>Busca em Largura</strong> (<em>BFS, do inglês Breadth-First search</em>) e <strong>Busca em Profundidade</strong> (<em>DFS, do inglês Depth-First search</em>). A diferença entre não é nem percebida em certos problemas, pois eles compartilham uma idéia fundamental: <strong>marcar os vértices já explorados para não repetir ações.</strong></p>
<p><strong>Busca em Largura</strong></p>
<p>A <em>Busca em Largura</em> é apropriada se nós não precisarmos de uma ordem específica para a busca ou se nós estamos interessados no menor caminho entre dois vértices para grafos não-valorados. A sua implementação utiliza duas vetores Boolean para manter o conhecimento sobre todos os vértices. Um vértice é <em>descoberto</em> a primeira vez que o visitamos. Um vértice é considerado <em>processado</em> depois de passarmos por todas as arestas provenientes dele.</p>
<p>Uma vez que o vértice é <em>descoberto</em>, ele é colocado em uma fila, sendo <em>processados</em> na <strong>ordem de chegada</strong>, pois os vértices mais antigos na fila são os mais próximos da raiz (local de partida para a busca). Para não encher o post somente com código, colocarei diversos links falando sobre<strong> BFS</strong>, para vocês darem uma olhada neles, depois voltarem para a continuação do post.</p>
<ul>
<li><a title="BFS - Wikipédia" href="http://pt.wikipedia.org/wiki/Busca_em_largura" target="_blank">Busca em largura &#8211; Wikipédia</a></li>
<li><a title="BFS - IME/USP" href="http://www.ime.usp.br/~pf/analise_de_algoritmos/aulas/bfs.html" target="_blank">Busca em largura &#8211; IME/USP</a></li>
<li><a title="BFS - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_em_grafos/aulas/bfs.html" target="_blank">Busca em largura &#8211; IME/USP &#8211; outra explicação</a></li>
<li><a title="BFS - Wikipedia" href="http://en.wikipedia.org/wiki/Breadth-first_search" target="_blank">Breadth-first search &#8211; Wikipedia</a></li>
</ul>
<p>O comportamento exato da <strong>BFS</strong> depende das funções de <strong>processar o vértice </strong>e <strong>processar a aresta</strong>, sendo essa a forma de personalizar a busca, podendo imprimí-los ou contar o número de arestas. Outra forma de personalizar é na função Boolean de <strong>validar a aresta</strong>, ignorando as não existentes. Ao retornar sempre <em>true</em>, percorreremos todas arestas, sendo uma <strong>BFS completa</strong>.</p>
<p><strong>Encontrando caminhos</strong></p>
<p>O vetor <em>parent</em> utilizado na <strong>bfs( )</strong> é muito útil para encontrar caminhos em um grafo. O vértice que descobriu <em>i</em> é denominado <em>parent[i]</em>. Essa relação define uma <em>árvore de descobertas</em> com o nó inicial como a raiz da árvore.</p>
<p>Pelo fato dos vértices serem descobertos em ordem crescente de distância da raiz, essa árvore tem uma propriedade muito importante. O caminho da <strong>raiz até <em>x</em></strong> (um dos vértices) utiliza o <em>menor número de arestas possível</em> para esse caminho.</p>
<p>Ele pode ser reconstruído seguindo os &#8220;ancestrais&#8221; de <em>x</em> até a raiz, pelo vetor<em> parent[ ]</em>, contudo será um caminho do fim para o começo. Nós podemos &#8220;consertá-lo&#8221; ao guardá-los em uma pilha. É preciso lembrar de dois pontos cruciais na utilização de <strong>BFS</strong>: só é possível descobrir o menor caminho entre <em>x</em> e <em>y</em>, se <em>x</em> for a<strong> raiz do grafo</strong>; além disso, essa ação só é realizada com eficiência em <strong>grafos não-valorados</strong>.</p>
<p><strong>Busca em Profundidade</strong></p>
<p><em>Busca em profundidade</em> utiliza a mesma idéia do <strong>Backtracking</strong>, mostrado na <a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Aula 5 </a>desse curso. Ambos envolvem a busca de todas as possibilidades ao avançar quando for possível e recuar quando não houver nada inexplorado à frente, sendo mais facilmente entendíveis como <strong>algoritmos recursivos</strong>. Essa busca pode ser pensada como <strong>BFS</strong> com uma <strong>pilha</strong> ao invés de <strong>fila</strong>. A parte bela dessa implementação é que a <strong>recursividade elimina a existência explícita de uma pilha</strong>, contudo não irei mostrar aqui o algoritmo completo, novamente sugerindo sites para vê-lo:</p>
<ul>
<li><a title="Busca em Grafos - UFSC" href="http://www.inf.ufsc.br/grafos/represen/busca.html" target="_blank">Busca em Grafos &#8211; UFSC</a></li>
<li><a title="Busca em Profundidade - Wikipédia" href="http://pt.wikipedia.org/wiki/Busca_em_profundidade" target="_blank">Busca em profundidade &#8211; Wikipédia</a></li>
<li><a title="Busca em Profundidade - IME/USP" href="http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/dfs1.html" target="_blank">Busca em profundidade &#8211; IME/USP</a></li>
<li><a title="Busca em Grafos" href="http://www.professeurs.polymtl.ca/michel.gagnon/Disciplinas/Bac/Grafos/Busca/busca.html" target="_blank">Busca em Grafos</a></li>
</ul>
<p>Com essa abordagem, chegamos ao final de mais uma <strong>aula de grafos</strong>, faltando apenas a abordagem de algoritmos como o de <strong>Dijkstra</strong> e da <strong>Árvore Geradora Mínima</strong>, os quais serão abordados próxima semana. Abaixo estão dispostos os exercícios a respeito das <strong>aulas 6 e 7</strong>:</p>
<ul>
<li><a title="Bicoloring" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10004.html" target="_blank">Bicoloring &#8211; Nível 1</a></li>
<li><a title="Playing With Wheels" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10067.html" target="_blank">Playing With Wheels &#8211; Nível 2</a></li>
<li><a title="The Tourist Guide" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10099.html" target="_blank">The Tourist Guide &#8211; Nível 3</a></li>
<li><a title="Slash Maze" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/7/705.html" target="_blank">Slash Maze &#8211; Nível 2</a></li>
<li><a title="Edit Step Ladders" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10029.html" target="_blank">Edit Step Ladders &#8211; Nível 3</a></li>
<li><a title="Tower of Cubes" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10051.html" target="_blank">Tower of Cubes &#8211; Nível 3</a></li>
<li><a title="From Dusk Till Dawn" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10187.html" target="_blank">From Dusk Till Dawn &#8211; Nível 3</a></li>
<li><a title="Hanoi Tower Troubles Again!" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10276.html" target="_blank">Hanoi Tower Troubles Again! &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Divulgação OBMEP" href="http://heltonduarte.com/2009/04/25/divulgacao-obmep/" target="_blank">Divulgação OBMEP</a></li>
<li><a title="Aula 6 - Grafos I" href="http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/" target="_blank">Programando melhor: Aula 6 &#8211; Grafos I</a></li>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Bracktracking</a></li>
<li><a title="Programando melhor: Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 2 - Estrutura de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Programando melhor: Aula 2 &#8211; Estrutura de Dados</a></li>
</ul>
<p><em>Vamos lá pessoal! Essas últimas aulas serão cruciais para a segunda fase da OBI, preparem-se! Qualquer dúvida ou dica, <strong>COMENTEM!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Os céus manifestam a glória de Deus e o firmamento anuncia a obra das suas mãos.&#8221;</em> <strong>Salmos 19.1</strong></p>
<p><em>&#8220;A lei do SENHOR é perfeita e refrigera a alma; o testemunho do SENHOR é fiel e dá sabedoria aos símplices.&#8221;</em> <strong>Salmos 19.7</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/30/programando-melhor-aula-7-grafos-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 6 &#8211; Grafos I</title>
		<link>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/</link>
		<comments>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 01:40:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[estruturas de dados]]></category>
		<category><![CDATA[grafos]]></category>
		<category><![CDATA[OBMEP]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=169</guid>
		<description><![CDATA[Aula 6 - Grafos I
Conteúdo: introdução aos conceitos, juntamente com as formas de utilizá-los no campo da computação.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal,</em></p>
<p>Hoje iniciaremos um assunto pedido a muito tempo por meus conhecidos: os tão temidos <strong>grafos</strong>! Contudo, eu já posso adiantar que eles não são complicados como vocês pensam, pelo menos o nível cobrado na<a title="OBI" href="http://olimpiada.ic.unicamp.br/" target="_blank"> OBI</a>. Os conceitos principais podem ser vistos em diversos locais, como nos sites da <a title="UFSC - Teoria dos Grafos" href="http://www.inf.ufsc.br/grafos/" target="_blank">UFSC</a> e <a title="IMC - USP - Teoria dos Grafos" href="http://www.icmc.usp.br/manuals/sce183/grafos.html" target="_blank">USP</a>, sendo essa uma área muito ampla da computação, recebendo muitas vezes uma disciplina completa nos cursos de <strong>Ciência e Engenharia da Computação</strong>. Para quem gosta de <strong>matemática</strong>, há também uma oportunidade de estudá-la, como no curso de <a title="Grafos, uma introdução" href="http://www.obmep.org.br/export/sites/default/arquivos/5_Grafos.pdf" target="_blank">iniciação científica da OBMEP</a>.</p>
<p><strong>Aula 6 &#8211; Grafos I</strong></p>
<p><strong>Conteúdo: </strong><em>introdução aos conceitos, juntamente com as formas de utilizá-los no campo da computação.</em></p>
<p><strong>Grafos</strong> são um dos temas mais interessantes da <em>ciência da computação</em> &#8211; uma representação abstrata que descreve a organização de <strong>sistemas de transporte, circuitos elétricos, linhas de telecomunicações</strong>, etc. Tantas estruturas diferentes podem ser modeladas utilizando esse conceito, tornando-o uma grande fonte de<strong> resolução de problemas</strong>. Será vistos hoje apenas o elementar dessa teoria, pela sua vasta abrangência, deixando os algoritmos mais específicos para as próximas aulas.</p>
<p><strong>Tipos de Grafos</strong></p>
<p>Um grafo<strong> G = (V, A)</strong> é definido por um conjunto de vértices <em>V</em> e um conjunto de arestas <em>A</em>, as quais consistem em <strong>pares de vértices</strong> contidos em <em>V</em>. Há diversas <strong>propriedades fundamentais</strong> dos grafos que influenciam na escolha de estruturas de dados  utilizadas para representá-los e os algoritmos para analisá-los. Vamos determinar quais são essas propriedades:</p>
<ul>
<li><strong>Indireto vs. Direto </strong>- Um grafo <em>G = (V, A)</em> é <em>indireto</em> se a aresta<em> (x, y)</em> pertencer a <em>A</em> e isso implicar que<em> (y, x) </em>também pertence. Se não, é tido como <em>grafo direto</em>. Ex: Ligações por estradas entre cidades são tipicamente indiretas, porque as estradas são de mão-dupla.</li>
<li><strong>Valorado vs. Não-Valorado </strong>- Em grafos valorados, cada aresta (ou vértice) de G é assinalada com um <em>valor numérico</em>, ou peso. Uma aplicação típica são estradas, as quais são valoradas com a distância ou o tempo para percorrê-la. A diferença entre esses tipos é basicamente para encontrar o <em>menor &#8220;caminho&#8221;</em> entre dois vértices.</li>
<li><strong>Simples vs. Não-Simples</strong> &#8211; Certos tipos de arestas complicam a tarefa de trabalhar com grafos. Um <strong>laço</strong> é uma aresta<em> (x, x) </em>envolvendo somente um vértice. Uma aresta <em>(x, y) </em>é <strong>múltipla</strong> se ocorre mais de uma vez no mesmo grafo. Um grafo que não possui nenhum desses tipos de aresta é chamado <em>Grafo Simples</em>.</li>
</ul>
<p><strong>Estrutura de Dados para Grafos</strong></p>
<p>Há muitas formas possíveis de representar um grafo, por isso nos focalizaremos nas mais comuns e úteis. Será assumido o grafo <em>G = (V, A) </em>contendo <em>n</em> vértices e <em>m</em> arestas.</p>
<ul>
<li><strong>Matriz de adjacência</strong> &#8211; Nós podemos representar <em>G</em> usando uma matriz M<em> n x n</em>, onde o elemento <em>M[i,j]</em> é 1 se <em>(i, j) </em>é uma aresta de G e 0 (zero) se não for. Isso permite respostas rápidas para a questão &#8220;(i,j) está em G?&#8221; e atualizações rápidas para inserir ou deletar arestas. Todavia, esse tipo de representação pode usar espaço excessivo na memória, ao ter muitos vértices e poucas arestas.</li>
<li><strong>Listas de adjacência</strong> &#8211; Uma forma mais eficiente de representar é usando <a title="Aula 2 - Estrutura de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">listas encadeadas</a> para guardar os adjacentes a cada vértice. Esse tipo requer ponteiros mas não tenha medo se já passou por experiências desagradáveis com eles. Listas de adjacência dificulta para saber se <em>(i, j) </em>está em <em>G</em>, contudo é MUITO mais econômico com memória.</li>
<li><strong>Listas de Adjacência em Matrizes</strong> &#8211; Listas de adjacências podem estar embutidas em <em>matrizes</em>, eliminando a necessidade de ponteiros. Nós podemos representar a lista em um vetor (ou na linha de uma matriz) mantendo um contador <em>k</em> de quantos elementos há e colocando-os nos primeiros <em>k</em> elementos do vetor. Agora é possível visitar os elementos do primeiro ao último da mesma forma deuma lista, mas incrementando o índice em um <em>loop</em> ao invés de ponteiros. Esse forma é particularmente importante no caso de grafos estáticos, os quais não mudam após sua construção e será sempre utilizada nos exemplos seguintes.</li>
</ul>
<p>Nós representamos um grafo usando a seguinte estrutura de dados: para cada grafo nós contabilizamos o número de vétices e os assinalamos de 1 a <em>nvertices</em>. As arestas estão em uma matriz MAXV x MAXGRAU, para cada vértice poder ser adjacente a outros MAXGRAU. Podemos definir MAXGRAU como MAXV, contudo isso seria desperdício em casos de grafos com graus baixos.</p>
<p>#define MAXV 100;              /* máximo número de vértices */</p>
<p>#define MAXGRAU 50;       /* máximo grau de um vértice */</p>
<p>typedef struct {</p>
<p>int arestas [MAXV+1][MAXGRAU];       /* informação de adjacência */</p>
<p>int grau[MAXV+1];            /* grau de cada vértice */</p>
<p>int nvertices;                        /* número de vértices no grafo */</p>
<p>int narestas;                        /* número de arestas no grafo */</p>
<p>} grafo;</p>
<p>Para demonstrar o uso dessa estrutura de dados, nós mostraremos como <strong>ler um grafo</strong>, tendo uma linha inicial o <strong>número de vértices e arestas no grafo</strong>, seguido por uma lista de arestas com um par de vértices por linha.</p>
<p>ler_grafo (grafo *g, bool direto)</p>
<p>{</p>
<p>int i;          /* contador */</p>
<p>int m;       /* número de arestas */</p>
<p>int x, y;   /* vértices em uma aresta (x, y) */</p>
<p>inicializar_grafo (g);</p>
<p>scanf (&#8220;%d %d&#8221;, &amp;(g-&gt;nvertices), &amp;m);</p>
<p>for (i = 1; i &lt;= m; i++) {</p>
<p>scanf (&#8220;%d %d&#8221;, &amp;x, &amp;y);</p>
<p>inserir_aresta (g, x, y, direto);</p>
<p>}</p>
<p>}</p>
<p>inicializar_grafo (grafo *g)</p>
<p>{</p>
<p>int i;            /* contador */</p>
<p>g-&gt;nvertices = 0;</p>
<p>g-&gt;narestas = 0;</p>
<p>for (i = 1; i &lt;= MAXV; i++) g-&gt;grau[i] = 0;</p>
<p>}</p>
<p>O método principal é o <strong>inserir_aresta</strong>. O parâmetro Boolean <em>direto</em> é utilizado para identificar quando é preciso inserir duas cópias de cada aresta ou só uma. Preste atenção no uso da recursão para resolver o problema.</p>
<p>inserir_aresta (grafo *g, int x, int y, bool direto)</p>
<p>{</p>
<p>if (g-&gt;grau[i] &gt; MAXGRAU)</p>
<p>printf (&#8220;Atenção: a inserção (%d, %d) excede o grau máximo\n&#8221;, x, y);</p>
<p>g-&gt;arestas[x][g-&gt;grau[x]] = y;</p>
<p>g-&gt;grau[x] ++;</p>
<p>if (direto == FALSE) inserir_aresta(g, y, x, TRUE)</p>
<p>else g-&gt;narestas ++;</p>
<p>}</p>
<p>Agora, a tarefa de imprimir o grafo é um trabalho bem simples:</p>
<p>imprimir_grafo (grafo *g)</p>
<p>{</p>
<p>int i, j;                 /* contadores */</p>
<p>for (i = 1; i &lt;= g-&gt;nvertices; i++) {</p>
<p>printf (&#8220;%d:  &#8220;, i);</p>
<p>for (j = 0; j &lt;= g-&gt;grau[i]; j++) {</p>
<p>printf (&#8221; %d&#8221;, g-&gt;arestas[i][j]);</p>
<p>}</p>
<p>printf (&#8220;\n&#8221;);</p>
<p>}</p>
<p>}</p>
<p>Bem pessoal, por hoje é só. Infelizmente, os <em>algoritmos de manipulação mais específica</em> de um grafo ficarão para a próxima aula, ok? E, como foram dados apenas conceitos, <strong>excepicionalmente hoje não haverá seção de exercícios.</strong> =(</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aula 5 - Backtracking" href="http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/" target="_blank">Programando melhor: Aula 5 &#8211; Backtracking</a></li>
<li><a title="Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_blank">Programando melhor: Revisão</a></li>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_blank">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_blank">Programando melhora: Aula 3 &#8211; Strings</a></li>
</ul>
<p><em>O que vocês acharam de grafos? Qualquer dúvida é só <strong>Comentar!</strong> Para treinar, façam os exercícios da apostila de grafos da iniciação científica da OBMEP, indicada no início, pois são muito bons. Além do mais, qualquer erro, principalmente na parte de código, porque é frequente o WordPress deixar estranho, é só avisar por comentário, ok?<br />
</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;A minha alma disse ao SENHOR: Tu és o meu SENHOR; não tenho outro além de ti.&#8221;</em> <strong>Salmos 16.2</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/18/programando-melhor-aula-6-grafos-i/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 5 &#8211; Backtracking</title>
		<link>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/</link>
		<comments>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 17:46:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[backtracking]]></category>
		<category><![CDATA[permutações]]></category>
		<category><![CDATA[subconjuntos]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://heltonduarte.com/?p=167</guid>
		<description><![CDATA[Aula 5 - Backtracking
Conteúdo: Explicação a respeito de algoritmos de Backtracking, técnica facilitadora em casos de problemas pesados.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal, estou de volta!!!</em></p>
<p>Para quem estava com saudades das aulas do <strong>&#8220;Programando melhor&#8221;</strong>, venho anunciar a volta com tudo do curso! Estive parado durante um tempo para resolver a<em> migração do blog</em>, além de estabelecer a <em>parceria com a Hostnet</em>, empresa a qual hospeda esse site. No entanto, tenho a alegria de informá-los que mais uma aula está pronta!</p>
<p><strong>Aula 5 &#8211; Backtracking</strong></p>
<p><strong>Conteúdo:</strong> <em>Explicação a respeito de algoritmos de Backtracking, técnica facilitadora em casos de problemas pesados.</em></p>
<p>A força bruta pode ser eficiente na resolução de problemas simples na área de computação, devido ao grande poder já presente nos computadores atuais, com média de 2GHz de clock do processador, ou seja, realizando 2 bilhões de operações por segundo! Contudo, existem casos em que a complexidade da situação exige <em>técnicas mais sofisticadas</em>, sendo uma delas o <strong>Backtracking</strong>!</p>
<p><strong>Backtracking</strong> é um método para iterar (percorrer) todas as possíveis configurações em um espaço qualquer. É um algoritmo geral que poderá ser personalizado para cada tipo de aplicação. De modo geral, a solução será um vetor <em>a = (a1, a2, &#8230;, a-n)</em>, sendo cada elemento <em>a-i</em> selecionado de um conjunto <em>Si</em>. Os exemplos mais comuns, os quais serão mostrados posteriormente, são a <em>criação de permutações e de subconjuntos</em>.</p>
<p>A cada passo do algoritmo, começa-se com uma solução parcial, diga-se <em>a = (a1, a2, &#8230;, a-k)</em>, e tenta-se aumentá-la, adicionando outro elemento ao seu fim. Após adicioná-lo, é preciso testar se há uma solução completa &#8211; se sim, deve-se imprimí-la, contá-la ou qualquer ação necessária. Se não é necessário checar se essa solução parcial é ainda expansível para alguma completa. Se for, continue testando, se não então apague o último elemento de a e teste outra possibilidade para aquela posição. O código é mostrado abaixo:</p>
<p>bool finished = FALSE;          /* Já encontrou todas as soluções? */</p>
<p>backtrack (int a[], int k, data input)</p>
<p>{</p>
<p>int c[MAXCANDIDATES];       /* Candidatos para a próxima posição */</p>
<p>int ncandidates;                         /* Número de candidatos para a próxima posição */</p>
<p>int i;            /* Contador */</p>
<p>if (is_a_solution(a, k, input))</p>
<p>process_solution(a, k, input);</p>
<p>else {</p>
<p>k = k + 1;</p>
<p>construct_candidates (a, k, input, c, &amp;ncandidates);</p>
<p>for (i = 0; i&lt;ncandidates; i++) {</p>
<p>a[k] = c[i];</p>
<p>backtrack(a, k, input);</p>
<p>if (finished) return;             /* Terminar mais cedo */</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>As sub-rotinas utilizadas no algoritmo serão especificadas abaixo:</p>
<ul>
<li><strong>is_a_solution(a, k, input)</strong> &#8211; Esse função booleana testa se os primeiros <em>k</em> elementos do vetor <em>a</em> são uma solução completa. O último argumento, <em>input</em>, permite-o utilizar informações proveitosas para essa rotina.</li>
<li><strong>construct_candidates(a, k, input, c, &amp;ncandidates)</strong> &#8211; Preenche um vetor<em> c</em> com todos os candidatos possíveis para a <em>k-ésima</em> posição de<em> a</em>, dado o conteúdo das primeiras <em>k-1</em> posições. O número de candidatos retornado é <em>ncandidates</em> e a variável <em>input</em> é novamente para alguma função auxiliar necessária.</li>
<li><strong>process_solution(a,k)</strong> &#8211; Esse método apenas imprime, conta ou faz algo necessário para o determinado problema, quando uma solução completa está pronta. A variável auxiliar, <em>input,</em> é desnecessária nessa situação.</li>
</ul>
<p><strong>Backtracking</strong> assegura o acerto por enumerar todas as possilidades sem visitar nunca o mesmo estado, sendo também <em>eficiente</em>. A<strong> recursividade</strong> promove a elegância e a fácil implementação desse algoritmo, porque o vetor de novos candidatos, <em>c</em>, é alocado com um procedimento recursivo.</p>
<p>As principais aplicações do <strong>backtracking</strong> são da criação de <a title="Backtracking - Subconjuntos" href="http://pt.wikipedia.org/wiki/Backtracking" target="_self">todos os subconjuntos de um conjunto S</a> e na criação de <a title="Backtracking - Permutações" href="http://pt.wikipedia.org/wiki/Backtracking" target="_self">todas as suas permutações</a>. Os links foram colocados para o <a title="Wikipédia.org" href="http://pt.wikipedia.org" target="_self">Wikipédia</a> para que o post não fique muito grande, ok?</p>
<p>Abaixo seguem os exercícios para o treinamento do assunto (confesso que estão difíceis dessa vez):</p>
<ul>
<li><a title="Little Bishops" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/8/861.html" target="_self">Little Bishops &#8211; Nível 2</a></li>
<li><a title="15-Puzzle Problem" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10181.html" target="_self">15-Puzzle Problem &#8211; Nível 3</a></li>
<li><a title="Queue" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=13&amp;page=show_problem&amp;problem=1069" target="_self">Queue &#8211; Nível 2</a></li>
<li><a title="Servicing Stations" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10160.html" target="_self">Servicing Stations &#8211; Nível 3</a></li>
<li><a title="Tug of War" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10032.html" target="_self">Tug of War &#8211; Nível 2</a></li>
<li><a title="Garden of Eden" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10001.html" target="_self">Garden of Eden &#8211; Nível 2</a></li>
<li><a title="Color Hash" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/7/704.html" target="_self">Color Hash &#8211; Nível 3</a></li>
<li><a title="Bigger Square Please..." href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10270.html" target="_blank">Bigger Square Please&#8230; &#8211; Nível 3</a></li>
</ul>
<p><strong>PS:</strong> Todo o conteúdo desse post e de todo o curso <strong>“Programando melhor”</strong> é baseado no livro <a title="Programming Challenges" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.programming-challenges.com');" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o “resumo” e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" onclick="javascript:pageTracker._trackPageview('/outbound/article/icpcres.ecs.baylor.edu');" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Revisão" href="http://heltonduarte.com/2009/03/27/programando-melhor-revisao/" target="_self">Programando melhor: Revisão</a></li>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_self">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="OBI vem aí!" href="http://heltonduarte.com/2009/03/07/obi-vem-ai/" target="_self">OBI vem aí!</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_self">Programando melhor: Aula 3 &#8211; Strings</a></li>
</ul>
<p><em>Vamos lá, pessoal! Não desistam porque estamos em preparação para a segunda fase da OBI, agora é pra valer! <strong>Comentem</strong> sobre o que vocês acharam do post e tirem suas dúvidas!</em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;O SENHOR prova o justo, mas a sua alma aborree o ímpio e o que ama a violência.&#8221;</em> <strong>Salmos 11.5</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/04/09/programando-melhor-aula-5-backtracking/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Revisão</title>
		<link>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/</link>
		<comments>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 01:02:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[jolly jumpers]]></category>
		<category><![CDATA[OBI]]></category>
		<category><![CDATA[the trip]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=164</guid>
		<description><![CDATA[Programando melhor: Revisão
Alguns pontos importantes para serem revisados antes da prova da OBI, além de comentários sobre a prova depois de sua realização.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Como a prova da<strong> primeira fase da OBI</strong> é amanhã resolvi fazer esse post para uma revisão rápida de vocês sobre algumas questões importantes.</p>
<p>Primeiramente, quero avisá-los para termos bastante <strong>atenção</strong> com a <strong>quantidade de loops feitos</strong>, pois diversos loops encadeados podem fazer você não passar em alguns dos testes feitos (normalmente passará nos mais simples, contudo não conseguirá a pontuação completa).</p>
<p>Segundo vim trazer mais um assunto possível para a prova, o qual explicarei posteriormente na aula sobre grafos, no entanto colocarei um exemplo de fácil entendimento da seção pratique da OBI, do nível 2, <a title="Batuíra - OBI" href="http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/batuira" target="_blank">Batuíra</a> (código resolvido abaixo):<code><br />
#include </code></p>
<p>#define INF 1000000;</p>
<p>int main()<br />
{<br />
/* Batuíra */<br />
int num = 1;  /* Número do teste */<br />
int n, x, y, z;  /* Quantidade de pontos e variáveis para distância */<br />
int dist[110][110];          /* Grafo para distância dos pontos */<br />
int i, j, k;    /* Contadores para loop for */</p>
<p>/* O Grafo dist[110][110] representa as distâncias entre os pontos de<br />
repouso. Por exemplo, o valor de dist[i][j] é a distância entre os pontos<br />
i e j */</p>
<p>/* Entrada do número de pontos */<br />
scanf (&#8220;%d&#8221;, &amp;n);</p>
<p>while (n != 0)<br />
{<br />
/* Coloca a distância padrão entre os pontos */<br />
for (i = 1; i &lt;= n; i++)<br />
{<br />
for (j = 1; j &lt;= n; j++)<br />
{<br />
if (i == j)<br />
{<br />
dist[i][j] = 0;    /* A distância para o próprio<br />
ponto de repouso é zero */<br />
}<br />
else<br />
{<br />
dist[i][j] = INF; /* Diz que a distância entre os pontos<br />
é &#8220;infinita&#8221;, ou seja, não há ligação entre eles */<br />
}<br />
}<br />
}</p>
<p>/* Lê os pontos e a distância entre eles */<br />
scanf (&#8220;%d %d %d&#8221;, &amp;x, &amp;y, &amp;z);<br />
/* A distância do ponto x ao ponto y é igual a z */</p>
<p>while (x != 0)       /* Quando qualquer valor for zero é o fim da<br />
entrada dos pontos */<br />
{<br />
/* Coloca as distâncias nas duas direções */<br />
dist[x][y] = z;<br />
dist[y][x] = z;</p>
<p>/* Lê os pontos e a distância entre eles */<br />
scanf (&#8220;%d %d %d&#8221;, &amp;x, &amp;y, &amp;z);<br />
}</p>
<p>/* Algoritmo de Floyd-Warshall */<br />
for (k = 1; k &lt;= n; k++)<br />
{<br />
for (i = 1; i &lt;= n; i++)<br />
{<br />
for (j = 1; j &lt;= n; j++)<br />
{<br />
/* Se houver um ponto de repouso entre i e j com uma<br />
menor distância, então o valor de pontos[i][j] é<br />
substituído pelo de (dist[i][k] + dist[k][j]) */<br />
if ((dist[i][k] + dist[k][j]) &lt; dist[i][j])<br />
{<br />
dist[i][j] = dist[i][k] + dist[k][j];<br />
dist[j][i] = dist[i][k] + dist[k][j];<br />
}<br />
}<br />
}<br />
}</p>
<p>/* Depois desse laço principal o valor de dist[1][n] é a menor<br />
distância entre o ponto inicial e o final, a qual representa o valor<br />
pedido pelo problema */</p>
<p>/* Saída de dados */<br />
printf (&#8220;Teste %d\n%d\n\n&#8221;, num, dist[1][n]);</p>
<p>/* Incremento para o próximo caso de teste */<br />
num++;</p>
<p>/* Entrada para o próximo caso de teste */<br />
scanf (&#8220;%d&#8221;, &amp;n);<br />
}</p>
<p>return (0);<br />
}</p>
<p>Fiquem bem atentos a parte de grafo, além do famoso <a title="Algoritmo de Floyd-Warshall" href="http://pt.wikipedia.org/wiki/Algoritmo_de_Floyd-Warshall" target="_blank">algoritmo de Floyd-Warshall</a>, o qual é suficientemente eficiente para esse problema.</p>
<p>Serão colocados comentários com dicas para os problemas <strong>&#8220;The Trip&#8221;</strong>, em <a title="Exercícios 1 (Parte I)" href="http://heltonduarte.com/2009/02/13/programando-melhor-exercicios-1-parte-1/" target="_blank">Exercícios 1 (Parte I)</a> e <strong>&#8220;Jolly Jumpers&#8221;</strong>, na <a title="Aula 2 - Estruturas de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Aula 2</a>, pois foram resolvidos por mim no site do <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/" target="_blank">UVa Online Judge</a> (finalmente).</p>
<p>Por fim, boa sorte a todos os que irão participar da competição amanhã (<strong>OBI</strong>), tomara que seja uma boa prova! Eu também participarei, esperando um bom resultado,<em> se Deus quiser</em>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aula 4 - Ordenação" href="http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/" target="_blank">Programando melhor: Aula 4 &#8211; Ordenação</a></li>
<li><a title="OBI vem aí!" href="http://heltonduarte.com/2009/03/07/obi-vem-ai/" target="_blank">OBI vem aí!</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_blank">Programando melhor: Aula 3 &#8211; Strings</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
</ul>
<p><em>E você, como se preparou para a OBI? Ah, quando a prova terminar, postem suas opiniões aqui e vamos discutir as questões! <strong>Comentem!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Entrega o teu caminho ao Senhor, confia nEle e Ele tudo fará.&#8221;</em><strong><em> </em>Salmos 37.5</strong></p>
<p><em>&#8220;O meu escudo está com Deus, que salva os retos de coração.&#8221;</em> <strong>Salmos 7.10</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/03/27/programando-melhor-revisao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 4 &#8211; Ordenação</title>
		<link>http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/</link>
		<comments>http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 15:25:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[insertion sort]]></category>
		<category><![CDATA[obi 2009]]></category>
		<category><![CDATA[quick sort]]></category>
		<category><![CDATA[selection sort]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=160</guid>
		<description><![CDATA[Aula 4 - Ordenação
Conteúdo: principais aplicações dos algoritmos de ordenação, assim como uma abordagem dos melhores métodos para esse tipo de atividade.]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Mais uma aula de preparação para a <a title="OBI 2009" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI 2009</a> (principalmente)! Pessoal do <a title="IF-RN" href="http://www.ifrn.edu.br" target="_blank">IF-RN</a>, preparem-se pesado, porque esse ano precisamos ter alguma medalha! =) A aula de hoje abordará um assunto também bem importante para competidores, visto que otimizar o método de ordenação é um fato muito importante nesse caso (não podemos sempre utilizar o <a title="Bubble Sort" href="http://pt.wikipedia.org/wiki/Bubble_sort" target="_blank">Bubble Sort</a>!).</p>
<p><strong>Aula 4 &#8211; Ordenação</strong></p>
<p><strong>Conteúdo:</strong> <em>principais aplicações dos algoritmos de ordenação, assim como uma abordagem dos melhores métodos para esse tipo de atividade.</em></p>
<p>Ordenação é um dos pontos primordias na ciências da computação, estando presente na solução de diversos problemas existentes nas competições e na vida do programador. Muitos algoritmos de ordenação já foram desenvolvidos, sendo necessário saber para que tipo de situação serve cada um (embora já existam muitos os quais não serão mais usados, por haver outros mais otimizados). Nessa aula, procurarei abordar as aplicações mais importantes da ordenação, além de uma teoria a respeito dos principais algoritmos da área.</p>
<p><strong>Aplicações da ordenação:</strong></p>
<ul>
<li><strong>Teste de unicidade: </strong>Como testar se os elementos de uma coleção S são todos distintos? Ordene-a crencente ou decrescentemente e faça uma varredura testando se S[i] = S[i+1].</li>
<li><strong>Priorizando eventos: </strong>Suponha que existem diversos trabalhos a serem feitos, cada um com seu deadline (data limite). Ordenando-os de acordo com o deadline os  colocará na ordem certa para serem cumpridos.</li>
<li><strong>Mediana:</strong> Se for necessário encontrar o k-ésimo maior item em uma lista S, é preciso apenas ordená-la, tendo o elemento S[k] como o requerido.</li>
<li><strong>Encontrando o par correto: </strong>Como podemos testar se existem dois inteiros <em>x</em>,<em> y</em> em S que <em>x+y = z</em>, onde<em> z</em> é um inteiro qualquer? Ao invés de testar todos os pares possíveis, ordene os números crescentemente. Como S[i] aumenta com o <em>i</em>, o provável parceiro<em> j</em> que tem S[j] = z &#8211; S[i] diminui. Com esse método fica bem mais eficiente sua procura.</li>
<li><strong>Busca eficiente:</strong> Para saber se um elemento <em>s </em>encontra-se em S, simplesmente ordena-se e lista e realiza-se uma <a title="Busca binária" href="http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria" target="_blank">busca binária</a> na fila, um dos métodos mais comuns de aplicação da ordenação.</li>
</ul>
<p><strong>Algoritmos de ordenação:</strong></p>
<p>Você já deve ter ouvido muitos algoritmos diferentes para ordenação de dados, no entanto deve estar pensando: para que uma pessoa precisa saber de tantos modos para se fazer a mesma coisa? O real motivo para se estudar todos esses códigos são as ideias por trás dos mesmos, ou seja, o modo como foi desenvolvido certo algoritmo pode ser utilizado para algum problema de uma forma parecida, deu pra entender? Abaixo serão mostrados os três mais interessantes para o estudo da sua teoria:</p>
<ul>
<li><strong>Selection Sort</strong> &#8211; Esse algoritmo divide o vetor de entrada em partes ordenadas e não-ordenadas e a cada varredura pela parte não-ordenada ele encontra o menor elemento e o transfere para o fim da região ordenada. São feitas muitas comparações, todavia é muito eficiente se contarmos o número de troca de posições, pois são apenas n-1, no pior dos casos. Segue no link os códigos em diversas linguagens: <a title="Selection Sort" href="http://pt.wikipedia.org/wiki/Selection_sort" target="_blank">Selection Sort</a>.</li>
<li><strong>Insertion Sort</strong> &#8211; Esse algoritmo também mantém regiões ordenadas e não-ordenadas. Em cada vez o próximo elemento não-ordenado é movido para a sua posição apropriada na região ordenada. Insertion sort é particularmente eficiente no que diz respeito a quantidade de movimento de dados, pois ele só inverte  um par de elementos para o local já certo, ou seja, em uma lista praticamente ordenada ele pode ser extremamente eficaz. Novamente os códigos seguem com o link: <a title="Insertion Sort" href="http://pt.wikipedia.org/wiki/Insertion_sort" target="_blank">Insertion Sort</a>.</li>
<li><strong>Quick Sort</strong> &#8211; É um dos mais eficientes e rápidos, reduzindo o trabalho de ordenar uma grande lista em ordenar duas listas menores. A partição separa o vetor nos elementos menores do que um certo <em>x</em> e os maiores do que o mesmo <em>x</em>. Como nenhum elemento precisará mover-se para fora de sua região, cada vetor menor poderá ser ordenado independentemente. Para facilitar a ordenação o quicksort também recebe como argumentos os índices do começo e fim do sub-vetor. Esse código é muito interessante por diversas razões, pois quando é implementado corretamente consome menos memória do que qualquer outro, além de ser uma das melhores demonstrações do poder da <a title="Recursividade" href="http://pt.wikipedia.org/wiki/Recursividade" target="_blank">recursividade</a> (uma função que chama ela mesma). Os exemplos em cada linguagem seguem no link: <a title="Quick Sort" href="http://pt.wikipedia.org/wiki/Quick_sort" target="_blank">Quick Sort</a>.</li>
</ul>
<p>Estamos no final da aula, mas não podemos deixar de praticar, não é verdade? Abaixo seguem os exercícios para o treinamento de ordenação:</p>
<ul>
<li><a title="Vito's family" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=982" target="_blank">Vito&#8217;s family &#8211; Nível 1</a></li>
<li><a title="Stacks of Flapjacks" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=56" target="_blank">Stacks of Flapjacks &#8211; Nível 2</a></li>
<li><a title="Bridge" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=978" target="_blank">Bridge &#8211; Nível 3</a></li>
<li><a title="Longest Nap" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=1132" target="_blank">Longest Nap &#8211; Nível 1</a></li>
<li><a title="Shoemaker's Problem" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=967" target="_blank">Shoemaker&#8217;s Problem &#8211; Nível 2</a></li>
<li><a title="CDVII" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=1079" target="_blank">CDVII &#8211; Nível 2</a></li>
<li><a title="ShellSort" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=1093" target="_blank">ShellSort &#8211; Nível 2</a></li>
<li><a title="Football (aka Soccer)" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=32&amp;page=show_problem&amp;problem=1135" target="_blank">Football (aka Soccer) &#8211; Nível 1</a></li>
</ul>
<p><strong>PS:</strong> Lembrando a todos que o conteúdo desse post e de todo o curso <strong>&#8220;Programando melhor&#8221;</strong> é baseado no livro <a title="Programming Challenges" href="http://www.programming-challenges.com/pg.php?page=index" target="_blank">Programming Challenges</a>, de autoria de<strong> Miguel Revilla</strong> e <strong>Steve Skiena</strong> e foi permitido o &#8220;resumo&#8221; e tradução do mesmo pelos próprios autores para a criação desse curso. Além disso os exercícios estão todos disponibilizados no site <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="OBI vem aí!" href="http://heltonduarte.com/2009/03/07/obi-vem-ai/" target="_blank">OBI vem aí!</a></li>
<li><a title="Aula 3 - Strings" href="http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/" target="_blank">Programando melhor: Aula 3 &#8211; Strings</a></li>
<li><a title="Aula 2 - Estruturas de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Programando melhor: Aula 2 &#8211; Estruturas de Dados</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
<li><a title="Cursos grátis na Internet - MIT" href="http://heltonduarte.com/2009/01/19/cursos-gratis-na-internet-mit/" target="_blank">Cursos grátis na Internet &#8211; MIT</a></li>
</ul>
<p><em>Pessoal, mais uma aula completa e dedicação é necessária! Façam sempre os exercícios! Procurarei nas próximas duas semanas, dedicar-me aos exercícios que já foram propostos aqui, colocando dicas para cada um, ok? Além disso, os próprios problemas da seção pratique do site da OBI. <strong>Comentem e tirem suas dúvidas! Vamos lá!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Bem-aventurado o varão que não anda segundo o conselho dos ímpios, nem se detém no caminho dos pecadores, nem se assenta na roda dos escarnecedores.&#8221;</em> <strong>Salmos 1.1</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/03/11/programando-melhor-aula-4-ordenacao/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 3 &#8211; Strings</title>
		<link>http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/</link>
		<comments>http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 19:49:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[OAH]]></category>
		<category><![CDATA[OBI]]></category>
		<category><![CDATA[strings]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=152</guid>
		<description><![CDATA[Aula 3 - Strings

Conteúdo: visão geral de como tratar strings, desde o modo em que elas aparecem nas diversas linguagens, até os principais métodos para lidar com elas.]]></description>
			<content:encoded><![CDATA[<p><em>Estou de volta!</em></p>
<p>Para aqueles que estavam ansiosos por mais uma aula preparatória para competições de programação (principalmente <a title="OBI 2009" href="http://olimpiada.ic.unicamp.br/" target="_blank">OBI</a>, pois já está próxima), venho aqui para isso! A aula de hoje não será tão grande, contudo tem uma importância extrema (quem viu a prova da 2ª fase da <a title="OAH 2008" href="http://oah.hostnet.com.br/wp/" target="_blank">OAH 2008</a> perceberá a importância desse assunto) e, como sempre, virá seguida de exercícios.</p>
<p>Eu sei que muitos podem estar achando os<strong> exercícios complicados</strong>, e realmente são, mas preciso informá-los que a<strong> persistência</strong> é o melhor remédio, pois eu estava empacado em um deles a mais de semana, só que ontem consegui receber um<strong> &#8220;Accepted&#8221;</strong> no site da <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a>! =) <em>Vamos, então, à batalha!</em></p>
<p><strong>Aula 3 &#8211; Strings</strong></p>
<p><strong>Conteúdo:</strong> <em>visão geral de como tratar strings, desde o modo em que elas aparecem nas diversas linguagens, até os principais métodos para lidar com elas.</em></p>
<p><strong>Strings</strong> são estruturas fundamentais de crescente importância. Vocês verão que os problemas apresentados nessa aula são um pouco mais fáceis do que o passado, todavia eles revelam a forma de como strings e caracteres são representados, além dos <strong>melhores algoritmos para manipular</strong> esse tipo de dado.</p>
<p><strong>Códigos dos caracteres:</strong> Os caracteres são apenas códigos os quais o computador associa a um símbolo, por esse motivo linguagens como C, C++ e Pascal tratam o tipo char como alguma coisa de 1 byte, nada mais do que isso. O <em>American Standard Code for Information Interchange</em> (<a title="Tabela ASCII - Wikipédia" href="http://pt.wikipedia.org/wiki/ASCII" target="_blank">ASCII</a>), ou Código Padrão Americano para Troca de Informações, representa o caracter por 1 byte, tendo um total de 2^7 = 128 tipos diferentes. Eles não foram ordenados ao acaso, possuindo algumas propriedades interessantes para o programador:</p>
<ul>
<li>Todos os <strong>caracteres não-imprimíveis</strong> possuem os 3 primeiros bits iguais a 0 (zero) ou os 7 menos sigficativos iguais a 1;</li>
<li>As<strong> letras minúsculas e maiúsculas</strong> aparecem ambas ordenadas sequencialmente, o que nos permite a criação de loops do primeiro (&#8220;a&#8221;) ao último (&#8220;z&#8221;);</li>
<li>Além do loop, podemos ver qual a posição apenas subtraindo pelo valor do início: &#8220;I&#8221; &#8211; &#8220;A&#8221; = 8;</li>
<li>Podemos <strong>converter de maiúscula para minúscula</strong> com operações simples como: &#8220;C&#8221; &#8211; &#8220;A&#8221; + &#8220;a&#8221;. Analogamente uma letra será maiúscula se estiver entre &#8220;A&#8221; e &#8220;Z&#8221;;</li>
<li>Ao <strong>ordenar um texto,</strong> estaremos simplesmente ordenando o seu código ASCII.</li>
</ul>
<p>Códigos mais modernos, como <a title="Unicode - Wikipédia" href="http://pt.wikipedia.org/wiki/Unicode" target="_blank">Unicode</a>, utilizam 2 ou até 3 bytes para representar um caracter, abrangendo qualquer língua do planeta.</p>
<p><strong>Representando strings:</strong> aqui apenas diferenciarei os modos de linguagens básicas tratarem as strings.</p>
<ul>
<li><strong>Vetores terminados com NULO:</strong> C/C++ tratam strings apenas como vetores de caracteres, terminando com o &#8220;&#8221; (zero ASCII). A não colocação desse último caracter pode gerar muita confusão no decorrer do programa, pois seria uma string &#8220;infinita&#8221;. <strong>Vantagem:</strong> pode-se acessar cada valor apenas indexando-os, assim como vetores.</li>
<li><strong>Vetor mais tamanho:</strong> Outro modo usual é utilizar o primeiro elemento do vetor para o tamanho da string, o que dispensa a utilização do caracter NULO. Essa forma é utilizada internamente pelo Java, apesar de ser mostrado ao programador como um objeto.</li>
</ul>
<p><strong>Manipulando strings:</strong> Para a sua manipulação será necessário o conhecimento de como sua linguagem trata esse dado, contudo para uma simplificação, iremos exemplificar com o suporte feito em C.</p>
<ul>
<li><strong>Computando o tamanho de uma String:</strong> Varre os caracteres, até encontrar o NULO, com um contador para o cálculo;</li>
<li><strong>Copiando uma String:</strong> Ao menos que sua linguagem de programação suporte igualar dois vetores de uma só vez, você terá que copiar elemento por elemento. <strong>OBS:</strong> não esqueça de criar o caracter NULO no fim!;</li>
<li><strong>String ao contrário:</strong> Se não for necessário manter a string original é preciso apenas trocar os elementos, num loop até a metade do tamanho. Caso seja preciso a primeira, então copia-se para outra string, só que da direita para a esquerda. <strong>OBS: </strong>novamente, não esqueça de criar o caracter NULO no fim!;</li>
<li>Por último, será apresentado um <strong>algoritmo</strong>, pouco eficaz, diga-se de passagem, mas SIMPLES, para contar quantas vezes alguma string <em>p</em> aparece em outra<em> t</em>.</li>
</ul>
<p><img class="aligncenter size-medium wp-image-154" title="Strings" src="http://heltonduarte.files.wordpress.com/2009/03/strings_algoritmo1.jpg?w=300" alt="Strings" width="300" height="294" /></p>
<p><strong>Bibliotecas de funções para strings:</strong> Já estamos no final da aula, mas deixaremos para vocês dicas de algumas bibliotecas já presentes nas linguagens, para o tratamento de strings:</p>
<ul>
<li><strong>C</strong> =&gt; &lt;ctype.h&gt; Manipulação de caracteres; &lt;string.h&gt; Manipulação de strings;</li>
<li><strong>C++ =&gt;</strong> as mesmas do C, além de uma classe string, a qual possui algumas funcionalidades interessantes. <a title="C Plus Plus" href="http://www.cplusplus.com/" target="_blank">MAIS</a>;</li>
<li><strong>Java =&gt;</strong> A classe String, com diversas operações avançadas em java.text;</li>
<li><strong>Pascal =&gt;</strong> Nativo do SysUtils, portanto todas as funções estão a sua disposição. <a title="Strings em Pascal" href="http://disciplinas.dcc.ufba.br/pub/MATA37/ListaDeExercicios3/strings-pascal.pdf" target="_blank">MAIS</a>.</li>
</ul>
<p>Bem pessoal, o conteúdo era esse, agora vamos praticar! <strong>OBS:</strong> Novamente eu lembro que todos os exercícios dispostos abaixo estão no <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_frontpage&amp;Itemid=1" target="_blank">UVa Online Judge</a> e eles possuem todos os direitos sobres os problemas.</p>
<ul>
<li><a title="WERTYU" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=1023" target="_blank">WERTYU &#8211; Nível 1</a></li>
<li><a title="Where's Waldorf?" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=951" target="_blank">Where&#8217;s Waldorf? &#8211; Nível 2</a></li>
<li><a title="Common Permutation" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=1193" target="_blank">Common Permutation &#8211; Nível 1</a></li>
<li><a title="Crypt Kicker II" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=791" target="_blank">Crypt Kicker II &#8211; Nível 2</a></li>
<li><a title="Automated Judge Script" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=1129" target="_blank">Automated Judge Script &#8211; Nível 1</a></li>
<li><a title="File Fragmentation" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=1073" target="_blank">File Fragmentation &#8211; Nível 2</a></li>
<li><a title="Doublets" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=1091" target="_blank">Doublets &#8211; Nível 3</a></li>
<li><a title="Fmt" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=31&amp;page=show_problem&amp;problem=789" target="_blank">Fmt &#8211; Nível 2</a></li>
</ul>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Aula 2 - Estrutura de Dados" href="http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/" target="_blank">Programando melhor: Aula 2 &#8211; Estrutura de Dados</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
<li><a title="Cursos grátis na Internet - MIT" href="http://heltonduarte.com/2009/01/19/cursos-gratis-na-internet-mit/" target="_blank">Cursos grátis na Internet &#8211; MIT</a></li>
<li><a title="OAH 2008" href="http://heltonduarte.com/2008/11/24/oah-2008/" target="_blank">OAH 2008</a></li>
</ul>
<p><em>Nossa primeira batalha está por vir, se preparem, porque a OBI vem aí! Vão treinando com esses exercícios e os da seção pratique da OBI que na prova será moleza! Qualquer dúvida e/ou sugestão postem! Vamos lá! <strong>Comentem!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Sonda-me, ó Deus, e conhece o meu coração; prova-me e conhece os meus pensamentos. E vê se há em mim algum caminho mau e guia-me pelo caminho eterno.&#8221;</em> <strong>Salmos 139.23,24</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/03/03/programando-melhor-aula-3-strings/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aula 2 &#8211; Estruturas de Dados</title>
		<link>http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/</link>
		<comments>http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 00:08:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[dicionários]]></category>
		<category><![CDATA[estruturas de dados]]></category>
		<category><![CDATA[filas]]></category>
		<category><![CDATA[pilhas]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=149</guid>
		<description><![CDATA[Aula 2 - Estruturas de Dados
Conteúdo: abordagem das estruturas de dados elementares, assim como mais dicas de como abordar um problema e os métodos para testar/debuggar.]]></description>
			<content:encoded><![CDATA[<p><em>Mais um pouco de conhecimento adquirido!</em></p>
<p>Bem pessoal, venho hoje postar a segunda aula do nosso curso <strong>&#8220;Programando melhor&#8221;</strong>, como sempre baseado no livro <strong>Programming Challenges</strong>, de <em>Steven Skiena</em> e <em>Miguel Revilla</em>, falando hoje um pouco sobre <strong>Estruturas de Dados</strong>, as quais infelizmente eu não vi no curso do CEFET-RN (atual IF-RN), contudo acredito serem essenciais para um bom programador. No final estarei indicando os links de exercícios para vocês praticarem o assunto estudado, blz? Vamos começar!</p>
<p><strong>Aula 2 &#8211; Estruturas de Dados</strong></p>
<p><strong>Conteúdo:</strong> <em>abordagem das estruturas de dados elementares, assim como mais dicas de como abordar um problema e os métodos para testar/debuggar.</em></p>
<p><strong>Estruturas de dados são primordiais</strong> em qualquer programa robusto, sendo primordial a escolha da estrutura certa para representar o problema, <strong>evitando códigos feios</strong> e diversos bugs pela frente. ^^</p>
<p>Iremos mostrar as principais estruturas de dados (<strong>pilhas, filas e dicionários</strong>), com algumas operações básicas para manipulá-las. Para aqueles programadores de C++ e Java já existem bibliotecas prontas para esse controle, contudo é interessante o entendimento de como elas trabalham por dentro. Para C++: stl.h; para Java: java.util.</p>
<p><strong>Pilhas:</strong> as pilhas e as filas são estruturas nas quais seus itens são controlados de acordo com a ordem de inserção e não pelo conteúdo armazenado. Ao inserir ou remover um item, fazemos em seu topo. As operações básicas são as seguintes:</p>
<p><em>Push(x, s)</em> &#8211; Insere o item x no topo da pilha s.</p>
<p><em>Pop(s)</em> &#8211; Retorna (e remove) o item do topo da pilha s.</p>
<p><em>Initialize(s)</em> &#8211; Cria uma pilha vazia.</p>
<p><em>Full(s), Empty(s)</em> &#8211; Testa se a pilha pode aceitar mais Push ou Pop, respectivamente.</p>
<p><em>Obs.:</em> Não há operação para procurar um item na pilha, justamente pelo fato que o conteúdo não importa, somente é vista a ordem de inserção.</p>
<p><strong>Filas:</strong> assim como nas pilhas, não importa o conteúdo, apenas a ordem. Nas filas os itens são inseridos em seu final e removidos do início. Um exemplo interessante do uso de filas é quando se trabalha com baralhos de cartas (tente fazer um exemplo para entender melhor XD ). A seguir, as operações:</p>
<p><em>Enqueue(x,q)</em> &#8211; Insere o item x no fim da fila q.</p>
<p><em>Dequeue(q)</em> &#8211; Retorna (e remove) o item da frente da fila q.</p>
<p><em>Initialize(q), Full(q), Empty(q)</em> &#8211; Análogos às operações de pilhas.</p>
<p>Filas precisam de um pouco mais de cuidado, já que acontecem coisas nos dois lados da estrutura. O modo mais simples de implementação é utilizando arrays (vetores), inserindo no final e movendo todos os elementos restantes para preencher o espaço vazio do Dequeue. Contudo, temos que pensar um pouco antes de criar filas com vetores, pois é bastante desperdício esse movimento a cada Dequeue e o fato de filas circulares, ou seja, o primeiro e o último elemento são iguais. Por essas e outras, filas são estruturas mais simples de se trabalhar com <a title="Listas Encadeadas: USP" href="http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html" target="_blank">listas encadeadas</a> (um pouco sobre ponteiros para os adeptos de Pascal <a title="Ponteiros em Pascal" href="http://www.icmc.usp.br/~sce182/ldinam.html" target="_blank">aqui</a>) do que com vetores.</p>
<p><strong>Dicionários:</strong> estruturas as quais pode-se trabalhar com o conteúdo dos elementos, tendo como operações primárias:</p>
<p><em>Insert(x,d)</em> &#8211; Insere o item x no dicionário d.</p>
<p><em>Delete(x,d)</em> &#8211; Deleta o item x (ou o item apontado por x) do dicionário d.</p>
<p><em>Search(k,d)</em> &#8211; Retorna o item com a chave k se o mesmo existir no dicionário d.</p>
<p>Nós precisamos, então, saber qual é a melhor maneira de se trabalhar com esse tipo de estrutura e assim segue abaixo cada caso:</p>
<p><em>Dicionários estáticos =&gt;</em> Essas estruturas são criadas uma vez e nunca mais mudadas, precisando então apenas do Search, não mais do Insert ou Delete. O melhor jeito para se trabalhar com eles é na utilização de vetores, sendo então sua preocupação apenas de como mantê-los ordenados, para otimizar suas buscas, contudo isso iremos ver em outras aulas.</p>
<p><em>Dicionários semi-dinâmicos =&gt;</em> São aqueles em que se pode inserir ou pesquisar (Search), porém não pode deletar. Se soubermos o máximo de elementos, é possível a utilização de vetores, contudo sem essa informação será preciso novamente trabalhar com listas encadeadas.</p>
<p><em>Dicionários dinâmicos =&gt;</em> Aqueles em que é permitida qualquer operação. Como muitos já devem ter percebido, a melhor maneira de se implementar esse tipo de estrutura é com a utilização de listas encadeadas, somente, para não tornar nosso código extremamente horroroso.</p>
<p>Finalmente chegamos ao fim dessa abordagem sobre estruturas de dados propriamente dita, esperando ter conseguido relembrar e otimizar o uso delas, além de fazê-lo mais preparado para os problemas que virão. A seguir colocarei mais dicas de resolução de problemas.</p>
<p><strong>Sua solução começa agora</strong></p>
<ul>
<li><em>Leia o programa atentamente</em> &#8211; Leia cada linha do problema cuidadosamente e releia quando o juiz online lhe reportar algum. Veja até mesmo a história que você acha não ter importância, no início do problema, porém preste bastante atenção às descrições de entrada/saída, além de seus exemplos.</li>
<li><em>Não assuma nada</em> &#8211; Esteja atento a instruções de entrada não especificadas, números sem limites, linhas longas de entrada, números negativos, etc. <strong>NÃO ESQUEÇA:</strong> qualquer situação que não é explicitada como proibida deve ser assumida como possível!</li>
<li><em>Não tão rápido</em> &#8211; Não se preocupe tanto com eficiência, a menos que você esteja passando por problemas com o juiz (como um conhecido &#8220;Time limit exceeded&#8221;). Ao conhecer bem as especificações, ou seja, sabendo qual o valor máximo para as entradas, é possível prever quão rápido necessitará ser seu algoritmo. <strong>IMPORTANTE:</strong> eu não estou incentivando códigos feios e cheios de gambiarras, todavia não é preciso um cuidado excessivo com isso logo no começo do trabalho, deu pra entender?</li>
</ul>
<p><strong>Testando e &#8220;debuggando&#8221;</strong></p>
<p>Aprender a evitar erros bestas que podem penalizá-lo em situações de competição é crucial para o sucesso em qualquer lugar, por isso seguem abaixo algumas táticas:</p>
<ul>
<li>Mesmo que pareça simples, é importantíssimo o teste feito com as entradas dadas pelo problema, pois lhe dirá qual a maneira de colocar sua saída na tela;</li>
<li>Se o problema exige determinadas ações ao se colocar entradas inválidas, certifique-se primeiramente que elas estão sendo feitas;</li>
<li>Crie sempre situações de teste simples, as quais você pode testar no papel e compare as soluções, pois pode ajudar na procura de erros mais comuns;</li>
<li>Coloque sempre entradas gigantescas (no limite do permitido), para ver como o programa se comporta, ou seja, se ele não fica &#8220;doido&#8221; com números grandes, comportando-se de maneira inesperada.</li>
<li><em>Conheça seu &#8220;Debugger&#8221;</em> &#8211; Qualquer ambiente de desenvolvimento vem agora com um &#8220;debugger&#8221; (a opção de executar o programa linha por linha) e é preciso que você o conheça claramente. Quanto mais cedo você começar a usá-lo, mais tempo e frustação que você vai evitar ^^;</li>
<li>No caso de não possuir esse &#8220;debugger&#8221;, crie pontos no programa para imprimir certos valores importantes, entretanto faça-os com linhas relevantes para ler a saída rapidamente e achar os possíveis erros;</li>
<li><em>Faça seus vetores um pouco maiores do que o necessário</em> &#8211; precisa comentar? É apenas para garantir que a memória não vai &#8220;acabar&#8221; durante a execução&#8230;</li>
</ul>
<p>É isso aí! Agora vamos para os exercícios e, como já avisado, apenas colocarei os links para eles no site do <a title="UVa Online Judge" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=1" target="_blank">UVa Online Judge</a>:</p>
<ul>
<li><a title="Jolly Jumpers" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10038.html" target="_blank">Jolly Jumpers &#8211; Nível 1<br />
</a></li>
<li><a title="Poker Hands" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/103/10315.html" target="_blank">Poker Hands &#8211; Nível 2<br />
</a></li>
<li><a title="Hartals" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=12&amp;page=show_problem&amp;problem=991" target="_blank">Hartals &#8211; Nível 2<br />
</a></li>
<li><a title="Crypt Kicker" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/8/843.html" target="_blank">Crypt Kicker &#8211; Nível 2<br />
</a></li>
<li><a title="Stack 'em Up" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10205.html" target="_blank">Stack &#8216;em Up &#8211; Nível 1<br />
</a></li>
<li><a title="Erdös Numbers" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10044.html" target="_blank">Erdös Numbers &#8211; Nível 2<br />
</a></li>
<li><a title="Contest Scoreboard" href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10258.html" target="_blank">Contest Scoreboard &#8211; Nível 1<br />
</a></li>
<li><a title="Yahtzee" href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=13&amp;page=show_problem&amp;problem=1090" target="_blank">Yahtzee &#8211; Nível 3<br />
</a></li>
</ul>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Exercícios 1 (Parte II)" href="http://heltonduarte.com/2009/02/14/programando-melhor-exercicios-1-parte-ii/" target="_blank">Programando melhor: Exercícios 1 (Parte II)</a></li>
<li><a title="Exercícios 1 (Parte I)" href="http://heltonduarte.com/2009/02/13/programando-melhor-exercicios-1-parte-1/" target="_blank">Programando melhor: Exercícios 1 (Parte I)</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
<li><a title="Cursos grátis na Internet - MIT" href="http://heltonduarte.com/2009/01/19/cursos-gratis-na-internet-mit/" target="_blank">Cursos grátis na Internet &#8211; MIT</a></li>
</ul>
<p><em>Como falei no meu Twitter: Bora lá pessoal, nossa guerra ainda está no começo! Animação! Qualquer dúvida sobre o assunto pode perguntar. Novamente, quando tiver dicas sobre os exercícios postarei e vocês façam o mesmo. <strong>Comentem!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Ainda que a figueira não floresça, nem haja frutos nas vides; ainda que falhe o produto da oliveira, e os campos não produzam mantimento; ainda que o rebanho seja extirpado da malhada e nos currais não haja gado; todavia eu me alegrarei no Senhor, exultarei no Deus da minha salvação.&#8221;</em> <strong>Habacuque 3.17,18</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/02/20/programando-melhor-aula-2-estruturas-de-dados/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Aviso</title>
		<link>http://heltonduarte.com/2009/02/17/programando-melhor-aviso/</link>
		<comments>http://heltonduarte.com/2009/02/17/programando-melhor-aviso/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 12:38:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[SECOPE]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=139</guid>
		<description><![CDATA[Aviso: Veja como será a programação do nosso curso durante essa e a próxima semana. Além disso veja as mudanças na estruturação do "Programando melhor".]]></description>
			<content:encoded><![CDATA[<p><em>Olá pessoal!</em></p>
<p>Hoje não haverá aula nem exercícios não, infelizmente, eu vim aqui apenas para comunicá-los como será a<strong> programação</strong> do nosso curso durante <strong>essa e a próxima semana</strong>, pois acontecerão algumas coisas não previstas&#8230;=(</p>
<p>Primeiramente, foi detectada o <strong>baixo aproveitamento</strong> do curso nos posts que traziam <strong>apenas exercícios</strong> e, por isso, eles não irão acontecer mais. Porém, não fique triste, pois não vou deixá-los na mão sem poder treinar o que aprenderam aqui, é claro, e <strong>serão disponibilizados os links</strong> <strong>para os problemas no próprio post de conteúdo</strong>, sendo essa uma forma de estimulá-los até a submeter os problemas para o juiz online, blz? Além disso, no próprio post de conteúdo poderão ser <strong>colocados comentários</strong> sobre os <strong>problemas</strong>, assim como <strong>dicas (minhas e do público)</strong> sobre como melhor resolvê-los, ok?</p>
<p>O outro aviso é a respeito das nossas aulas dessa e da próxima semana: o <strong>conteúdo </strong><em>dessa semana</em> será proposto apenas na <strong>sexta-feira</strong>, porque não houve tempo suficiente para a resolução dos problemas propostos na semana passada e não iremos atolá-los de assunto sem treinamento, não é mesmo? Próxima semana irá ocorrer o<strong> carnaval (infelizmente)</strong> e essa pessoa que vos fala participará de um evento durante esse período (<a title="[Seminário] Como no Pentecostes" href="http://www.comonopentecostes.com.br/" target="_blank">SECOPE</a>). Portanto, na próxima semana irei apenas me reestruturar após o evento e resolver os exercícios sobre o assunto, para que a partir do dia 03/03/2009, daqui a 15 dias, nós publiquemos a<strong> terceira aula do curso &#8220;Programando melhor&#8221;.</strong></p>
<p>Por fim, gostaria de <strong>agradecer </strong>a todos os quais <strong>contribuíram com comentários</strong> durante a primeira semana do curso e me <strong>fizeram elogios</strong>. Queria apenas dizer que fiquei muito grato por ver a quantidade de pessoas visitando o blog e é esse mesmo meu objetivo: <strong>ver os brasileiros com sede de conhecimento e buscando aprender coisas novas</strong>.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Curso de programação - Confirmado!" href="http://heltonduarte.com/2009/02/03/curso-de-programacao-confirmado/" target="_blank">Curso de programação &#8211; Confirmado!</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
<li><a title="Exercicios 1 (Parte I)" href="http://heltonduarte.com/2009/02/13/programando-melhor-exercicios-1-parte-1/" target="_blank">Programando melhor: Exercícios 1 (Parte I)</a></li>
<li><a title="Exercicios 1 (Parte II)" href="http://heltonduarte.com/2009/02/14/programando-melhor-exercicios-1-parte-ii/" target="_blank">Programando melhor: Exercícios 1 (Parte II)</a></li>
</ul>
<p><em>O que você achou das novidades? O que tem achado do nosso curso até agora? Tem vontade de nos ajudar, pois mande um e-mail para <strong>hm_duarte@hotmail.com</strong> para conversarmos melhor e, se possível, fazermos juntos um post para todos nós. <strong>Comente!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;Filho meu, se aceitares as minhas palavras, e entesourares contigo os meus mandamentos, para fazeres atento à sabedoria o teu ouvido, e para inclinares o teu coração ao entendimento; sim, se clamares por discernimento, e por entendimento alçares a tua voz; se o buscares como a prata e o procurares como a tesouros escondidos; então entenderás o temor do Senhor, e acharás o temor de Deus.&#8221;</em> <strong>Provérbios 2.1-5</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/02/17/programando-melhor-aviso/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programando melhor: Exercícios 1 (Parte II)</title>
		<link>http://heltonduarte.com/2009/02/14/programando-melhor-exercicios-1-parte-ii/</link>
		<comments>http://heltonduarte.com/2009/02/14/programando-melhor-exercicios-1-parte-ii/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 19:02:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programando Melhor]]></category>
		<category><![CDATA[exercícios]]></category>
		<category><![CDATA[Interpreter]]></category>
		<category><![CDATA[LCD Display]]></category>

		<guid isPermaLink="false">http://heltonduarte.wordpress.com/?p=130</guid>
		<description><![CDATA[Exercícios 1 (Parte II): mais dois problemas para vocês se divertirem um pouco, com um nível mais difícil do que os anteriores, para caminharmos em busca de nossas conquistas.]]></description>
			<content:encoded><![CDATA[<p><em>Mais diversão para vocês!</em></p>
<p><strong>Problema 3: LCD Display</strong></p>
<p><strong>UVa ID:</strong> 706    ;    <strong>Nível:</strong> Fácil</p>
<p>Um amigo seu acabou de comprar um novo computador. Antes disso, a máquina mais poderosa que ele havia usado foi uma calculadora de bolso. Ele está um pouco desapontado porque ele gostava do display LCD da sua calculadora mais do que da tela do seu novo computador! Para fazê-lo feliz, escreva um programa que imprima números no estilo de um display LCD.<br />
<em><br />
Entrada</em></p>
<p>O arquivo de entrada contém diversas linhas, uma para cada número a ser disposto na tela. Cada linha contém inteiros s e n, onde n é o número a ser disposto (0 &lt;= n &lt;= 99.999.999) e s é o tamanho que ele irá aparecer (1 &lt;= s &lt;= 10). A entrada será terminada por uma linha contendo dois zeros, que não deve ser processada.</p>
<p><em>Saída</em></p>
<p>Escreva os números especificados no arquivo de entrada em estilo display LCD usando s sinais &#8220;-&#8221; para os segmentos horizontais e s sinais &#8220;|&#8221; para os verticais. Cada dígito ocupa exatamente s + 2 colunas e 2s + 3 linhas. Esteja certo de preencher todos os espaços brancos ocupados pelos dígitos com &#8220;espaços&#8221;, incluindo o último dígito. Deve haver exatamente uma coluna de &#8220;espaços&#8221; entre dois dígitos.</p>
<p>Coloque uma linha de &#8220;espaço&#8221; após cada número. Você encontrará um exemplo de cada dígito no Exemplo de saída abaixo.</p>
<p><em>Exemplo de entrada<br />
</em><br />
2 12345</p>
<p>3 67890</p>
<p><em>Exemplo de saída</em></p>
<p><em><br />
</em></p>
<p style="text-align:center;"><img class="size-full wp-image-133 aligncenter" title="Exemplo de Saida" src="http://heltonduarte.files.wordpress.com/2009/02/numeros2.jpg" alt="Exemplo de Saida" width="293" height="344" /></p>
<p><strong>Problema 4: Interpreter (Interpretador)</strong></p>
<p><strong>UVa ID:</strong> 10033       ;     <strong>Nível:</strong> Médio</p>
<p>Um certo computador tem dez registradores e 1000 palavras de RAM. Cada registrador ou local na RAM armazena um inteiro de três dígitos entre 0 (zero) e 999. Intruções são codificadas como inteiros de três dígitos e armazenadas na RAM. Os códigos são os seguintes:</p>
<p>100  | <em>manter</em></p>
<p>2dn  | armazena no registrador <em>d</em> o valor <em>n</em> <em>(entre 0 e 9)</em></p>
<p>3dn  | adiciona <em>n</em> ao valor armazenado em <em>d</em></p>
<p>4dn  | multiplica por <em>n</em> o valor armazenado em <em>d</em></p>
<p>5ds  | armazena em <em>d</em> o mesmo valor armazenado em <em>s</em></p>
<p>6ds  | adiciona o valor armazenado em <em>s</em> ao armazenado em <em>d</em></p>
<p>7ds  | multiplica o valor armazenado em <em>d</em> pelo de <em>s</em></p>
<p>8da  | armazena em <em>d</em> o valor de RAM que tiver seu endereço armazenado no registrador <em>a</em></p>
<p>9sa  | armazena na RAM, cujo endereço esteja em <em>a,</em> o valor armazenado no registrador<em> s</em></p>
<p>0ds  | vai para o local armazenado no registrador <em>d</em> a menos que o registrador <em>s</em> cotenha 0 (zero)</p>
<p>Todos os registradores inicialmente contém 000 (zero). O conteúdo inicial da RAM é lido de uma entrada padrão. A primeira instrução a ser executada é no endereço RAM zero. Todos os resultados são reduzidos módulo 1000.</p>
<p><em>Entrada</em></p>
<p>A entrada começa com um único inteiro positivo na linha, indicando o número de casos, cada um descrito abaixo. É seguido por uma linha em branco e haverá uma linha em branco entre cada duas entradas consecutivas.</p>
<p>Cada caso de entrada consiste num inteiro sem sinal de três dígitos, representando os conteúdos de locais consecutivos na RAM, começando pelo zero. Locais de RAM não especificados são inicializados com 000 (zero).</p>
<p><em>Saída</em></p>
<p>A saída de cada caso de teste é um único inteiro: o número de instruções executadas acima e incluindo a de &#8220;manter&#8221;. Você pode assumir que o programa faz o &#8220;manter&#8221;. Separe a saída de dois casos consecutivos por uma linha em branco.</p>
<p><em>Exemplo de entrada</em></p>
<p>1</p>
<p>299</p>
<p>492</p>
<p>495</p>
<p>399</p>
<p>492</p>
<p>495</p>
<p>399</p>
<p>283</p>
<p>279</p>
<p>689</p>
<p>078</p>
<p>100</p>
<p>000</p>
<p>000</p>
<p>000</p>
<p><em>Exemplo de saída</em></p>
<p>16</p>
<p>É isso aí pessoal, temos agora <strong>a segunda parte da primeira bateria de exercícios</strong> proposta como treinamento, ok? Os exeercícios de agora são <strong>um pouco mais difíceis</strong> (confesso que não entendi nem o que pede o problema 4 de primeira olhada xD ), contudo não desanimem, pois precisamos pegar pesado se queremos alguma coisa.</p>
<p><strong>Posts interessantes:</strong></p>
<ul>
<li><a title="Exercicios 1 (Parte I)" href="http://heltonduarte.com/2009/02/13/programando-melhor-exercicios-1-parte-1/" target="_blank">Programando melhor: Exercícios 1 (Parte I)</a></li>
<li><a title="Aula 1 - Começando" href="http://heltonduarte.com/2009/02/10/programando-melhor-aula-1-comecando/" target="_blank">Programando melhor: Aula 1 &#8211; Começando</a></li>
<li><a title="Cursos grátis na Internet - MIT" href="http://heltonduarte.com/2009/01/19/cursos-gratis-na-internet-mit/" target="_blank">Cursos grátis na Internet &#8211; MIT</a></li>
<li><a title="Top Coder Marathon Matches" href="http://heltonduarte.com/2009/01/14/top-coder-marathon-matches/" target="_blank">Top Coder Marathon Matches</a></li>
<li><a title="Olimpiadas do Conhecimento" href="http://heltonduarte.com/2009/01/08/olimpiadas-do-conhecimento/" target="_blank">Olimpíadas do Conhecimento</a></li>
</ul>
<p><em>Novamente, qualquer dica para a solução de problemas é extremamente bem vinda e dúvidas serão, à medida do possível, respondidas. <strong>Deixe seu comentário falando o que achou dos problemas! E conte também seu caso de sucesso!</strong></em></p>
<p><strong>Helton de Melo Duarte</strong></p>
<p><em>&#8220;A sabedoria exalta aos que a favorecem, honra aos que a amam, e empresta graça à aparência de uma pessoa, para que esta seja admirada e respeitada por aqueles que a conhecem.&#8221;</em> <strong>Charles Fritsch</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://heltonduarte.com/2009/02/14/programando-melhor-exercicios-1-parte-ii/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

