Вы находитесь на странице: 1из 34

Estruturas de Dados

Apresentaremos aqui as principais estuturas de dados e como utiliz-las em uma competio.

Vetores
Em geral sabemos antecipadamente qual ser o nmero mximo de elementos no vetor. Ento, em C ou C++, basta fazer:
TIPO vetor[MAX_TAM];

Onde MAX_TAM uma constante que indica o nmero mximo de elementos que o vetor vai guardar. Se no soubermos o tamanho do vetor em tempo de compilao e o compilador utilizado for o gcc, podemos fazer:
TIPO vetor[n];

Onde n uma varivel que indica quantos elementos deve caber no vetor. O gcc gera cdigo para a alocao dinmica automaticamente. Um caso difcil de acontecer, mas que pode aparecer, quando temos que guardar dados em vetores antes de saber qual ser seu tamanho final. Isso pode acontecer, por exemplo, em um problema de grafos em que temos que usar listas de adjacncia e o grafo descrito por suas arestas. Nesse caso podemos utilizar o tipo vector de C++. Declaramos ele assim:
#include<vector> using namespace std; vector<TIPO> vetor;

Para adicionar um elemento elem ao seu fim:


vetor.push_back(elem);

Para saber seu tamanho:


vetor.size()

Podemos ordenar vetores em C utilizando a funo qsort da stdlib.h. Para isso necessria uma funo de comparao que recebe dois elementos e retorna um valor negativo, 0 ou positivo se o primeiro elemento menor, igual ou maior que o segundo, respectivamente. Para a ordenao de um vetor de inteiros, usamos:
#include<stdlib.h> ... int comp(void *a, void *b) { return *((int*)a)-*((int*)b); }

int main() { int vetor[MAX_TAM]; ... qsort(vetor, n, sizeof(*vetor), comp); ... }

Onde n o nmero de elementos no vetor. Mas para qu fazer isso se temos C++? muito mais simples:
#include<algorithm> using namespace std; int main() { int vetor[MAX_TAM]; ... sort(&vetor[0],&vetor[n]); ... }

Para vector podemos utilizar tambm sort(vetor.begin(),vetor.end()).

Strings
C++ e Java do um bom suporte para o trabalho com strings. C uma pssima opo para trabalhar com esse tipo de dados. Cabealho:
C: C++ Java: #include<strings.h> #include<string> (nenhum)

Declarao:
C: C++: Java: char s[MAX_TAM]; string s; String s; ou StringBuffer s;

Consulta:
C: C++: Java: s[i] s[i]; s.charAt(i);

Alterao:
C: C++: Java: s[i] = c; s[i] = c; s.setCharAt(i,c); (somente para StringBuffer)

Cpia:
C: C++: Java: strcpy(dest, orig); dest = orig; dest = orig;

Concatenao:
C: C++: Java: strcpy(dest,s1); strcat(dest, s2); dest = s1+s2; dest = s1+s2;

Tamanho:
C, O(n): C++, O(1): Java, O(1): strlen(s); s.size(); s.length();

As strings em C++ possuem o mtodo c_str() que retorna um ponteiro para a string no formato de C (vetor de char terminado em '\0'). As strings em C++ e Java ainda possuem mtodos para encontrar uma string em outra, extrair substrings, inserir strings no meio de outras, inverter a cadeia, alm de outros.

Pilha
Um pilha em C ou C++ ou Java de no mximo MAX_TAM elementos do tipo TIPO pode ser definida simplesmente como:
TIPO pilha[MAX_TAM]; // Vetor onde sero guardados os elementos int tp=0; // Inteiro que diz o tamanho da pilha

importante ter em mente que o valor tp indica a posio onde o prximo elemento deve ser inserido, ou seja, uma posio frente do elemento no topo da pilha. Nmero de elementos:
tp

Testar se a pilha est vazia:


tp == 0

Inserir um elemento elem no topo da pilha:


pilha[tp++] = elem;

Retirar o elemento do topo da pilha e guardar em elem:

elem = pilha[--tp];

Com isso temos toda a funcionalidade de uma pilha de forma bem simples e eficiente e sem precisar definir explicitamente um novo tipo.

Fila
Um fila em C ou C++ ou Java em que se insira no mximo MAX_TAM elementos do tipo TIPO pode ser definida simplesmente como:
TIPO fila[MAX_TAM]; // Vetor onde sero guardados os elementos int fi=0; // Inteiro que aponta para o incio da fila int ff=0; // Inteiro que aponta para o fim da fila

importante ter em mente que a todo momento o valor fi indica a posio do elemento na frente da fila e o valor ff indica a posio onde ser inserido o prximo elemento. Nmero de elementos:
ff - fi

Testar se a pilha est vazia:


fi == ff

Inserir um elemento elem no fim da fila:


fila[ff++] = elem;

Retirar o elemento do incio da pilha e guardar em elem:


elem = fila[fi++];

Com isso temos toda a funcionalidade de uma fila de forma bem simples e eficiente e sem precisar definir explicitamente um novo tipo. Note que o tamanho do vetor poderia ser apenas o nmero mximo de elementos simultaneamente na fila, realizando incrementos nos ponteiros com aritmtica modular. No entanto normalmente a memria mais do que suficiente para abrigar todos os elementos que sero inseridos, o que simplifica ao mximo nossa estrutura.

Mapas
Mapas so estruturas pouco utilizadas em competies, mas s vezes so necessrias. Quando eles aparecem normalmente so para mapear strings em inteiros. A linguagem C no oferece um suporte especial para mapas. Em geral pode-se criar dois vetores. Um que guarda as chaves e outro que guarda os valores. Faz-se uma busca

seqencial no vetor das chaves para encontrar o ndice e depois obtm-se o valor no outro vetor. O mais prtico usar C++:
#include <map> #include <string> using namespace std; ... map<string,int> mapa; mapa["teste"] = 10; string key = "teste"; int val = mapa[s]; // val recebe 10

bom lembrar que esse mapa implementado utilizando rvores, o que deixa a complexidade de consulta e alterao como O(log.n).

Estruturas em C++
Pilha #include <stack> stack <string> pilha; Mtodos: pilha.empty();//retorna true se a pilha estiver vazia pilha.pop();//remove o topo da pilha pilha.push(eu);//insere o argumento no topo da pilha pilha.size();//retorna o tamanho da pilha Fila #include <queue> queue <string> fila; Mtodos: fila.push("EU"); //adiciona no final da fila o argumento fila.empty();//retorna true se a fila estiver vazia fila.front();//retorna o primeiro elemento da fila fila.pop();//remove o primeiro elemento da fila Vector #include <vector> vector<int> vetor; vetor.empty();//retorna true se estiver vazio vetor.size();//retorna o tamanho do vetor vetor[0] vetor.front(); //retorna o primeiro elemento do vetor vetor.back(); //retorna o ultimo elemento do vetor vetor.push_back (eu);//insere um novo elemento ao final do vetor vetor.pop_back(); //remove o ultimo elemento vetor.clear();//limpa o vetor String #include <string> string a; a.c_str();//retorna um vetor de char a.clear();//limpa a string a[2]='a';// deque - manipulao de lista duplamente ligada list - manipulao de lista simplesmente ligada map - manipulao de conjunto associativo ordenado (associao: chave -> valor) set - manipulao de conjunto

Manipulao de Strings Segundo o dicionrio, o verbo manipular significa compor, misturar, manobrar ou operar sobre alguma coisa. String um tipo de dados que faz parte da linguagem C++ especificamente projetado para operar com seqncias de caracteres. Diferente da linguagem C++, a linguagem C no possui o tipo de dados string. A linguagem C utiliza o tipo de dados char para armazenar informaes de texto, que nada mais do que um conjunto de caracteres em uma matriz na memria. O tipo de dados string o tipo de dados mais familiar aos seres humanos. Ele pertence a uma classe com muitos recursos embutidos para operar de forma mais intuitiva e com algumas caractersticas adicionais comuns a linguagem C. Dessa forma, manipular uma string alterar, ou obter informaes sobre o que est armazenado nesse tipo de dados. Iterators: Iterators so as estruturas usadas para percorrer e/ou acessar os elementos contidos em um continer de maneira unificada. Estas estruturas escondem os detalhes da implementao. Dessa maneira, alm da programao ser facilitada fica menos propensa a erros. Um iterator deve permitir percorrer sobre o continer (++i, --i) e acesso (*i). So quatros os iterators: a) begin Retorna um iterator referindo-se ao primeiro caractere na string. b) end Retorna um iterator referindo-se ao elemento seguinte aps o ltimo caractere na string. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de string"); string::iterator it; for ( it=str.begin() ; it < str.end() ; it++ ) cout << *it; cout << "\n"; }

c) rbegin
Retorna um iterator inverso, ou seja, o ltimo caractere na seqncia.

d) rend
Retorna um iterator inverso, ou seja, o primeiro caractere na seqncia. Exemplo: #include <iostream> #include <string> using namespace std;

main () { string str ("Maratona de programao"); string::reverse_iterator rit; for ( rit=str.rbegin() ; rit < str.rend(); rit++ ) cout << *rit; cout << "\n"; }

Capacidade da string: a) size Retorna a quantidade de caracteres de uma string. Exemplo:


#include <iostream> #include <string> using namespace std; main () { string str ("Maratona de Programao"); cout << "A quantidade de caracteres da string : " << str.size() << "\n"; }

b) length Retorna a quantidade de caracteres de uma string. Igual a size. Exemplo:


#include <iostream> #include <string> using namespace std; main () { string str ("Maratona de Programao"); cout << "A quantidade de caracteres da string : " << str.length() << "\n"; }

c) max_size Retorna o nmero mximo de caracteres que o objeto string pode conter. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Manipulao de Strings"); cout << "max_size: " << str.max_size() << "\n"; }

d) resize Redimensiona o contedo da string de n caracteres. Se n for menor que o comprimento atual da seqncia, o contedo reduzido aos seus primeiros n caracteres, sendo o resto descartado.

Se n for maior do que o comprimento atual da seqncia, o contedo ampliado para atingir um tamanho de n caracteres. Exemplo:
#include <iostream> #include <string> using namespace std; main () { size_t sz; string str ("Teste de string"); cout << str << endl; sz=str.size(); str.resize (sz+2,'!!'); //Resultado: Teste de string cout << str << endl << "\n"; str.resize (5); cout << str << endl << "\n"; //Resultado: Teste }

e) clear O contedo da string definido como uma seqncia vazia, apagando qualquer contedo anterior e deixando o seu tamanho em zero caractere. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Contedo da string"); cout << str << "\n"; str.clear(); cout << "Contedo aps clear(): " << str << "\n"; }

f)

empty Retorna se a string est vazia, ou seja, se seu tamanho zero. Esta funo no modifica o contedo da string. Exemplo:
#include <iostream> #include <string> using namespace std; int main () { string str ("Texto da String"); if (!str.empty()) cout << "A string no est vazia.\n"; else cout << "A string est vazia\n"; }

Elementos de Acesso: a) Operador []

Retorna o valor da string na posio informada. Exemplo:


#include <iostream> #include <string> using namespace std; main () { string str ("Teste de String"); cout << "Primeiro caractere: " << str[0] << "\n"; //Resultado: T cout << "Segundo caractere: " << str[1] << "\n"; //Resultado: e }

b) at Retorna o valor da string na posio informada. Esta funo se comporta como o operador [], exceto que a tambm executa uma verificao do intervalo, gerando uma exceo no caso da posio no existir na cadeia. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de String"); cout << "Primeiro caractere: " << str.at(0) << "\n"; //Resultado: T cout << "Segundo caractere: " << str.at(1) << "\n"; //Resultado: e }

Modificadores: a) Operador += Une o contedo existente a uma nova seqncia. Exemplo:


#include <iostream> #include <string> using namespace std; main () { string nome ("Fulano"); string sobrenome ("Tal"); nome += " de "; nome += sobrenome; nome += "\n"; //Resultado: Fulano de Tal cout << nome; system("pause"); }

b) append O contedo da string atual estendido pela adio de uma seqncia de caracteres. Sintaxe: str.append(string, posio_inicial,
numero_de_caracteres_a_incluir);

Exemplo:
#include <iostream> #include <string> using namespace std;

main () { string str; string str2="Maratona "; string str3="de Preparao"; str.append(str2); //Resultado: str = "Maratona " str.append(str3,0,3); //"de " str.append("Programao", 11); //Resultado: "Programao" str.append(1,'.'); //Resultado: "." cout << str << "\n"; system("pause"); }

c) push_back Acrescenta um carter nico para o contedo da string, aumentando seu tamanho por um. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Maratona"); cout << "Antes: " << str << "\n"; str.push_back('x'); cout << "Depois: " << str << "\n"; //Resultado: Maratonax system("pause"); }

d) insert Insere uma string em outra a partir de uma determinada posio. Sintaxe: Sintaxe: str.insert(posicao, string_inserir, pos_inicial_str,
pos_final_str);

Exemplo:
#include <iostream.h> using namespace std; main () { string str1="nossa"; string str2="uri"; str1.insert(2,str2); //Resultado = nourissa str1.insert(2,"123456789",3,4); //Resultado = no4567urissa cout << str1 << "\n"; system("pause"); }

e) erase Apaga uma cadeia de caracteres a partir de uma posio inicial por uma determinada quantidade de caracteres. Sintaxe: Sintaxe: str.insert(posicao_inicial, quantidade_caracteres);

Exemplo:
#include <iostream.h> using namespace std; main () { string str1="nossa"; str1.erase(3,1); //nosa cout << str1; system("pause"); }

f)

replace Substitui uma string por outra. Sintaxe: str.replace(posio_inicial, quantidade_posicoes, str_substituir); Exemplo:
#include <string> #include <iostream> using namespace std; main() { string str = "Gosto de Java"; // vamos substituir Java por C str.replace(9, 4, "C"); cout << str << "\n\n"; }

Operadores sobre Strings a) copy Copia parte de uma string. Sintaxe: str.copy(string_destino, quantidade_caracteres, posio_inicial); Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str1 ("Testando strings...."); char str2[10]; str1.copy(str2, 7, 9); cout << str2 << "\n"; //Resultado: strings system("pause"); }

b) find Localiza uma string dentro de outra string. Exemplo:


#include <string> #include <iostream>

using namespace std; main() { string frase = "Maratona de Programao em C"; int pos = frase.find("Programao"); if(pos == string::npos) cout << "A substring nao foi encontrada.\n\n"; else cout << "A substring foi encontrada" << " na posicao " << pos << ".\n\n"; system("pause"); // pausa o programa }

c) rfind Localiza a ltima ocorrncia de uma string dentro de outra string. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de string teste para maratona"); string key ("teste"); int found; found=str.rfind(key); cout << found << "\n"; //Resultado: 16 system("pause"); }

d) substr Retorna uma seqncia de caracteres que comea em uma determinada posio e tem um comprimento de n caracteres. Sintaxe: resultado = str.substr(posicao_inicial, quantidade_caracteres); Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str="Ns estamos trabalhando com strings"; string str2; str2 = str.substr (12,11); //Resultado: trabalhando cout << str2 << "\n"; system("pause"); }

e) compare Compara duas strings. Retorna 0 se as strings comparadas so iguais, caso contrrio um nmero diferente de 0 retornado.

Sintaxe: str.compare(posicao_inicial, quantidade, string); Exemplo:


#include <iostream> #include <string> using namespace std; main () { string str1 ("URI-FW"); string str2 ("URI"); if (str1.compare(str2) != 0) cout << str1 << " NO IGUAL A " << str2 << "\n"; if (str1.compare(0,3,"URI") == 0) cout << "So iguais\n"; system("pause"); }

Converses: a) toupper Converte o caractere para maisculo. Exemplo:


#include <iostream.h> main() { char tecla; cout << "Pressione qualquer tecla para converter em maisculo: "; cin >> tecla; cout << "O valor da tecla em maisculo : " << (char) toupper(tecla) << "\n"; system("pause"); } Para realizar a converso para minsculo basta alterar a funo toupper para tolower.

b) transform Converte todos os caracteres da cadeia para maisculo. Exemplo:


#include <iostream> #include <string> using namespace std; main() { string str; cout << "Informe qualquer texto para converter em maisculo: "; cin >> str; transform(str.begin(), str.end(), str.begin(), ::toupper); cout << "O valor do texto em maisculo : " << str << "\n"; system("pause"); }

Para realizar a converso para minsculo basta alterar o parmetro ::toupper para ::tolower.

c) atoi Converte uma string para um valor inteiro. A parte fracionria ser desconsiderada. Exemplo:
#include <iostream.h> main() { int valor; char caractere[] = "123455.233"; valor = atoi (caractere); cout << valor; cout << "\n"; system("pause"); }

d) atol Converte uma string para um valor inteiro longo. A parte fracionria ser desconsiderada. Exemplo:
#include <iostream.h> main() { long int valor; char caractere[] = "123455.233"; valor = atol (caractere); cout << valor; cout << "\n"; system("pause"); }

e) atof Converte uma string para um valor real (float). Exemplo:


#include <iostream.h> main() { double valor; char caractere[] = "123455.233"; valor = atof (caractere); cout << valor << "\n"; system("pause"); }

f)

strtod

Converte uma string para um valor numrico real. A varivel erro receber um valor diferente de null se algum erro ocorrer na converso. A varivel erro dever ser do tipo char. Exemplo:
#include <iostream.h>

main() { char caracteres[] = "365.25 abc"; char * erro; double valor; valor = strtod(caracteres, &erro); cout << valor << "\n"; cout << erro << "\n"; system("pause"); }

g) strtol Converte a cadeia str para um valor numrico inteiro. A parte fracionria ser desprezada. A varivel erro receber um valor diferente de null se algum erro ocorrer na converso. A varivel erro dever ser do tipo char. O parmetro base significa em qual base o valor ser convertido (base = 10 decimal, base = 16 - hexadecimal). Sintaxe: strtol(str, &erro, base); Exemplo:
#include <iostream.h> main() { char caracteres[] = "365.25 abc"; char * erro; long int valor; valor = strtol(caracteres, &erro, 10); cout << valor << "\n"; cout << erro << "\n"; system("pause"); }

Funes de validao Ambas encontram-se na biblioteca ctype.h. Retornam um valor inteiro.


isdigit (c) isalpha(c) isascii(c) islower(c) ispunct(c) isspace(c) isupper(c) Determina se o argumento numrico. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento alfabtico. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento um caractere ASCII. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento uma letra minscula. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento um caractere de pontuao. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento um caractere em branco. Retorna um valor diferente de zero se for verdadeiro. Determina se o argumento uma letra maiscula. Retorna um valor diferente de zero se for verdadeiro.

Mximo Divisor Comum


Utiliza o algoritmo de Euclides. Entrada:

Inteiros a e b.

Sada:

Maior inteiro que divide a e b.

Complexidade: O( log(a) + log(b) ) Global:


int mdc(int a, int b) { if(a<0) a = -a; if(b<0) b = -b; if(b == 0) return a; else return mdc(b, a%b); }

Teste de Primalidade
Entrada:

Inteiro n.

Sada:

Valor booleano que indica se n primo ou no.

Complexidade: O( sqrt(n) ) Global:


int ehPrimo(int n) { if(n==2) return 1; if(n<=1 || n%2 == 0) return 0; for(int i=3; i*i<=n; i+=2) if(n%i == 0) return 0; return 1; }

EXEMPLOS DE PROGRAMAS
Exemplo de programa que l 2 nmeros a e b e escreve a soma dos mesmos. Exemplo arquivo entrada 10 5 38 20 30 #include <iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) { cout << a << " + " << b << " = " << a+b << endl; } return(0); } Exemplo arquivo sada 10 + 5 = 15 3 + 8 = 11 20 + 30 = 50

1) WERTYU
#include #include #include #include <iostream> <map.h> <string.h> <fstream.h>

using namespace std; map<char, char> m; main() { //Primeira Linha m['=']='-'; m['-']='0'; m['0']='9'; m['9']='8'; m['8']='7'; m['7']='6'; m['6']='5'; m['5']='4'; m['4']='3'; m['3']='2'; m['2']='1'; m['1']='`'; //Valores padro m['Q']='Q'; m['A']='A'; m['Z']='Z'; string linha, resultado; ifstream fin("entrada.txt"); // Abre arquivo de entrada para leitura ofstream fout("saida.txt"); //Cria um arquivo de sada getline(fin, linha); //Busca o valor da primeira linha while( fin ) { // Enquanto no for fim de arquivo //Segunda Linha m['W']='Q'; m['E']='W'; m['R']='E'; m['T']='R'; m['Y']='T'; m['U']='Y'; m['I']='U'; m['O']='I'; m['P']='O'; m['[']='P'; m[']']='['; m['\\']=']'; //Terceira linha m['\'']=';'; m[';']='L'; m['L']='K'; m['K']='J'; m['J']='H'; m['H']='G'; m['G']='F'; m['F']='D'; m['D']='S'; m['S']='A'; //Quarta linha m['/']='.'; m['.']=','; m[',']='M'; m['M']='N'; m['N']='B'; m['B']='V'; m['V']='C'; m['C']='X'; m['X']='Z';

resultado.clear(); for(int i=0;i<linha.length();i++) { resultado.push_back(m[linha[i]]); } fout << resultado << endl; //Escreve o resultado no arquivo de sada getline(fin, linha); //Busca o valor da prxima linha } fin.close(); fout.close(); system("pause"); }

2) Common Permutation
#include <iostream> #include <string> #include <fstream> using namespace std; string A, B; ifstream fin("entrada.txt"); // Abre arquivo de entrada para leitura ofstream fout("saida.txt"); //Cria um arquivo de sada void calcula() { int i, m, j, posicao; string caractere; string resultado (""); //Ordena as strings sort(A.begin(),A.end()); sort(B.begin(),B.end()); //Remove os espaos em branco remove(A.begin(), A.end(), ' '); remove(B.begin(), B.end(), ' '); for(i = 0; i< A.length(); i++) { for(j=0; j< B.length(); j++) { caractere = B[j]; if (A.compare(i, 1, caractere) == 0) { //verifica se o caractere no est no resultado posicao = resultado.rfind(caractere); if( posicao < 0 ) { resultado.push_back(B.at(j)); } } } } fout << resultado << endl; } main() { getline(fin, A); //Busca o valor da primeira linha getline(fin, B); //Busca o valor da segunda linha while( fin ) { calcula(); getline(fin, A); //Busca o valor da prxima linha getline(fin, B); //Busca o valor da prxima linha } fin.close(); fout.close(); system("pause"); } // Enquanto no for fim de arquivo

3) Primo #include <iostream> using namespace std; bool primo(int x) { int i; if (x<2) return(false); if (x==2) return(true); if (x%2==0) return(false); for(i=3;i*i<=x;i=i+2) { if (x%i==0) return(false); } return(true); } int main() { int a; while(cin >> a) { if (primo(a)) cout << "primo" << endl; else cout << "nao primo" << endl; } return(0); }

4) FatDiv escreve o fatorial se o nmero for impar ou a quantidade de divisores e os divisores se for par #include <iostream> #include <queue> using namespace std; queue <int> fila; long int fat(int x) { if (x<=1) return(1); else return(x * fat(x-1)); } int divisores(int x) { int i, cont; cont=2; fila.push(1); for(i=2;i*2<=x;i++) { if(x%i==0) { fila.push(i); cont++; } } fila.push(x); return(cont); } int main() { int a, cont; while(cin >> a) { if (a%2==0) { cout << a <<" possui " << divisores(a) << " divisores: "; cont = 0; while(!fila.empty()) { if (cont>0) cout << ","; cout << fila.front(); fila.pop(); cont++; } } else cout << a << "!=" << fat(a); cout << endl; } return(0); }

5) Campo Minado #include<iostream> #include<string> using namespace std; int main() { int n; int m; int campo = 0; while(cin >> n >> m) { string s[100]; cin.ignore(); if (n==0 || m==0) return 0; for(int p=0; p<n; p++) { s[p] == ""; for(int q = 0; q<m; q++) { char tempIn; cin >> tempIn; s[p] += tempIn; } } if(campo>0) cout << endl; campo++; cout << "campo #" << campo << ":"<< endl; // Calcula s for(int p=0; p<n; p++) // Checa os 8 quadrados ao redor { bool cima = false; bool baixo = false; if(p < 1) cima = true; if(p == n-1) baixo = true; for(int i=0; i<s[p].length(); i++) { if(s[p][i] != '*') { int count = 0; bool esquerda = false; bool direita = false; if(i < 1) esquerda = true; if(i == m-1) direita = true; if(!cima && !esquerda) if(s[p-1][i-1] == '*') count++; if(!cima)

if(s[p-1][i] == '*') count++; if(!cima && !direita) if(s[p-1][i+1] == '*') count++; if(!esquerda) if(s[p][i-1] == '*') count++; if(!direita) if(s[p][i+1] == '*') count++; if(!baixo && !esquerda) if(s[p+1][i-1] == '*') count++; if(!baixo) if(s[p+1][i] == '*') count++; if(!baixo && !direita) if(s[p+1][i+1] == '*') count++; cout << count; }else{ cout << "*"; } } cout << endl; } } return 0; }

6) Caminho mais curto simples #include <iostream> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado

#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias

void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES]; int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;

} /* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; } current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ cout << s << " a " << t <<": "; int caminho = t; cout << t; while (caminho != s) {

cout << path[caminho]; caminho = path[caminho]; if (caminho != s) cout << ", "; } printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ } /* fim dijkstra */ int main() { int a, b, c; init_graph (); while (cin >> a >> b >> c) { if (a==0 && b==0 && c==0) break; joinwt (a, b, c); joinwt (b, a, c); } while (cin >> a >> b) { dijkstra (b, a); } return 0; }

7) Rota mais curta com nomes de cidades e uso de pilha #include <iostream> #include <string> #include <stack> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado

#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 string nome[50]; int cont; stack<string> pilha; struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias

void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES];

int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = } todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;

/* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; }

current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ // cout << dist[t] << ": "; cout << nome[s] << " a " << nome[t] <<": "; int caminho = t; pilha.push(nome[t]); while (caminho != s) { pilha.push(nome[path[caminho]]); caminho = path[caminho]; } //printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ cont =0; while(!pilha.empty()) { if (cont>0) cout << ", "; cout << pilha.top(); pilha.pop() ; cont++; } cout << endl; } /* fim dijkstra */ int main() { char s[100]; int qcidades, a, b, c; init_graph (); cin >> qcidades; gets(s); for (int i=1;i<=qcidades;i++) { gets(s); nome[i]=s; } while (cin >> a >> b >> c) { if (a==0 && b==0 && c==0) break; joinwt (a, b, c); joinwt (b, a, c); } while (cin >> a >> b) { dijkstra (a, b); } return 0; }

8) Rota mais rpida com nomes de cidades e uso de pilha #include <iostream> #include <string> #include <stack> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado

#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 string nome[50]; int cont; stack<string> pilha; struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias

void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES];

int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = } todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;

/* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; }

current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ // cout << dist[t] << ": "; cout << nome[s] << " a " << nome[t] <<": "; int caminho = t; pilha.push(nome[t]); while (caminho != s) { pilha.push(nome[path[caminho]]); caminho = path[caminho]; } //printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ cont =0; while(!pilha.empty()) { if (cont>0) cout << ", "; cout << pilha.top(); pilha.pop() ; cont++; } cout << endl; } /* fim dijkstra */ int main() { char s[100]; int qcidades, a, b, c, d, tempo; init_graph (); cin >> qcidades; gets(s); for (int i=1;i<=qcidades;i++) { gets(s); nome[i]=s; } while (cin >> a >> b >> c >> d) { if (a==0 && b==0 && c==0) break; tempo = (int)(((float)c / d)*60); joinwt (a, b, tempo); joinwt (b, a, tempo); } while (cin >> a >> b) { dijkstra (a, b); } return 0; }

9) LCD Display #include <string> #include <iostream> using namespace std;


char {{{' {{' {{' {{' {{' {{' {{' {{' {{' {{' a[10][5][3] ','-',' '}, ',' ',' '}, ','-',' '}, ','-',' '}, ',' ',' '}, ','-',' '}, ','-',' '}, ','-',' '}, ','-',' '}, ','-',' '}, = {'|',' {' ',' {' ',' {' ',' {'|',' {'|',' {'|',' {' ',' {'|',' {'|',' ','|'}, ','|'}, ','|'}, ','|'}, ','|'}, ',' '}, ',' '}, ','|'}, ','|'}, ','|'}, {' {' {' {' {' {' {' {' {' {' ',' ',' ',' ',' ','-',' ','-',' ','-',' ','-',' ','-',' ',' ',' ','-',' ','-',' '}, '}, '}, '}, '}, '}, '}, '}, '}, '}, {'|',' {' ',' {'|',' {' ',' {' ',' {' ',' {'|',' {' ',' {'|',' {' ',' ','|'}, ','|'}, ',' '}, ','|'}, ','|'}, ','|'}, ','|'}, ','|'}, ','|'}, ','|'}, {' {' {' {' {' {' {' {' {' {' ','-',' ',' ',' ','-',' ','-',' ',' ',' ','-',' ','-',' ',' ',' ','-',' ','-',' '}}, //0 '}}, //1 '}}, //2 '}}, //3 '}}, //4 '}}, //5 '}}, //6 '}}, //7 '}}, //8 '}}}; //9

int main(){ int s; string n; while(1){ cin >> s >> n; //if ((s == 0) && (n == '0')) break; for (int linha = 0; linha < 5; linha++){ //vare as linhas int p = 1; if ((linha == 1) || (linha == 3)) p = s; for (int y = 0; y < p; y++){ for (int j = 0; j < n.size(); j++){ //percore o valor a ser impresso int num = (n[j]-48); for (int coluna = 0; coluna < 3; coluna++){ //varre as colunas int q = 1; if (coluna == 1) q = s; for (int x = 0; x < q; x++) cout << a[num][linha][coluna]; } cout << ' '; } cout << endl; } } } return 0; }

10) Outros Exemplos #include<iostream> using namespace std; int main() { int n,t,p,soma,totais; string s; while (cin >> t >> n) { if (t == 0) break; soma = 0; totais = t * n; for (int i = 0; i < n; i++){ cin >> s >> p; soma += p; } cout << totais - soma << endl; } return 0; }

#include <map> #include <string> #include <iostream> using namespace std; int main() { map<int, string> digitos; int s; digitos[0] = "zero"; digitos[1] = "um"; while (cin >> s) { cout << digitos[s] << endl; } return 0; }

Вам также может понравиться