Universidade Federal do Paran - UFPr Departamento de Informtica - DInf 2 o. Treino UDESC - UFPR 2008 Organizadores: Claudio (DCC) e Andr Guedes (DInf) 21 de julho de 2008 Lembrete: permitido consultar livros, anotaes ou qualquer outro material impresso cpia durante a prova. A correo automatizada, portanto siga atentamente as exigncias da tarefa quanto ao formato da entrada e sada de seu programa. Todos os problemas tm o mesmo valor na correo. Procure resolver o problema de maneira eciente. Na correo, a ecincia tambm levada em conta. As solues sero testadas com outras entradas alm das apresentadas como exemplo dos problemas. Nas implementaes, as entradas e as sadas conhecidas sero padro (ler e escrever na sada padro). Utilize o Clarication para dvidas da prova. Opcionalmente, os juzes respondem, contudo, as respostas so acessveis a todos. 1 Problema A: Computador de Palavras Arquivo: string.[c|cpp|java] A DataAzul comprou recentemente o seu mais novo computador, um computador de processa- mento de palavras dubbed o X9091. Espera-se que tenha alguma valor/utilidade para criptograa e reas ans. (Se espalham boatos que os chineses esto trabalhando em um clone que corrija tal codi- cao criptogrca, mas ns ignoraremos tal rumor). Este computador aceitar entradas de palavras e produzir como sada outras palavras, dependendo do programa carregado dentro dele naquele mo- mento. O chip da CPU de uma ltima gerao com tecnologia RISC. Contudo, este tem somente trs instrues na transformao de palavras: D Delete ou exclua um caracter numa posio em particular. I Insira um caracter em uma posio em particular. C Mude o caracter de uma posio em particular por um outro caracter diferente. Isto , troque de caracter em uma dada posio. Os programas escritos para esta mquina esto em um formato de cdigo de mquina onde cada instruo tem o formato ZXdd, onde Z representa o cdigo para uma instruo (D, I ou C), X um carter e o dd representa um nmero de dois dgitos. Um programa terminado por uma instruo especial da parada que consiste na letra E. Observe que cada instruo trabalha sobre a palavra na memria cada vez que a instruo executada. Para ver como tudo isso funciona considere o seguinte exemplo. Deseja-se transformar a palavra abcde para palavra bcgfe. Isto poderia ser obtido por uma srie de comandos da mudana (C), mas este no seria minimal. O seguinte programa melhor: abcde Da01 bcde % observe o a necessrio porqu ele vericado pelo hardware Cg03 bcge If04 bcgfe E bcgfe % Trmina o programa Escreva um programa que leia duas palavras (uma palavra de entrada e a palavra de sada ou alvo) e produza um programa minimal em X9091 necessrio transformar a palavra de entrada na palavra de sada. Desde que pode haver umas solues mltiplas, somente uma deve ser produzido. Qualquer soluo que satisfaa estes critrios ser aceita. A entrada consistir em uma srie das linhas, cada linha que contem duas palavras separadas por exatamente um espao. As palavras tem no mximo 20 carteres em minsculos. O arquivo ser nalizado por uma linha contendo um nico #. A sada consistir em uma srie das linhas, uma para cada linha da entrada. Cada linha consiste em um programa na lnguagem X9091. Entrada abcde bcgfe # Sada Da01Cg03If04E 2 Problema B: Theseu e o Minotauro? Arquivo: theseu.[c|cpp|java] Aqueles de vocs com educao clssica devem lembrar da lenda de Theseu e o Minotauro. Esta a fbula envolvendo um mostro com cabea de touro, um labirinto subterrneo com pequenas passagens parecidas, amores perdidos de donzelas em bolas de seda. Na linha educacional desta competio, iremos agora revelar a verdadeira estria. O labirinto era na verdade uma srie de cavernas conectadas por passagens diretas, algumas das quais s podiam ser atravessadas em uma direo. Para encurralar o Minotauro, Theseu levou escon- dido consigo uma grande quantidade de velas para dentro do Labirinto, pois ele havia descoberto que o Minotauro tinha medo da luz. Theseu cminhou a esmo at ouvir o Minotauro aproximando-se pelo tnel. Neste momento ele acendeu uma vela e partiu em perseguio. O Minotauro bateu em retirada para dentro da caverna da qual havia sado e fugiu por outra passagem. Theseu o seguiu lentamente, at que encontrou a k-sima caverna desde que ele acendeu a vela. Aqui ele teve tempo suciente para colocar a vela acesa no meio da caverna, acender outra vela naquela e continuar a perseguio. Com o progresso da perseguio, uma vela era deixada em cada k-sima caverna que era atravessada, assim limitando o movimento do Minotauro. Sempre que o Minotauro entrava numa caverna ele devia checar as sadas em uma ordem especca, fugindo por aquela que no levasse diretamente a uma caverna iluminada. (Lembre-se que como Theseu carregava uma vela acesa, o Minotaura nunca saia da caverna pelo tnel usado para entrar nela). Eventualmente o Minotauro cou encurralado, possibilitando Theseu derrot-lo. Considerando os Labirintos a seguir como exemplo, onde no caso o Minotauro verica as sadas das cavernas em ordem alfabtica: A E G H D C B F Figura 1: Uma caverna em ordem alfabtica Assumindo que Theseu est na caverna C quando ouve o Minotauro aproximando de A, e para este cenrio o valor de K 3. Ele acende a vela e comea a caada, perseguindo o Minotauro atravs de A, B, D (deixa uma vela), G, E, F (outra vela), H, E, G (outra), H, E (encurralado). Escreva um programa que simular a perseguio de Theseu ao Minotauro. A descrio do la- birinto vai identicar cada caverna por um caractere maisculo e ir listar as cavernas alcanveis a partir daquela na ordem que o Minotauro ir tentar, seguida dos identicadores para as cavernas as quais o Minotauro e teseu estavam e quando o contato foi feito pela primeira vez, seguido pelo valor de k. O arquivo de entrada consistir de uma srie de linhas. Cada linha descrever um cenrio no formato mostrado abaixo(que descreve o exemplo acima). Nenhuma linha poder conter mais de 255 caracteres. O arquivo ser nalizado por uma linha com apenas o caractere #. O arquivo de sada ir consistir de uma linha para cada labirinto. Cada linha ir identicar as cavernas iluminadas, na ordem na qual as velas foram deixadas, e a caverna na qual o Minotauro est encurraldo, seguindo o formato mostrado abaixo. Entrada A:BCD;B:AD;D:BG;F:H;G:DEH;E:FGH;H:EG;C:AD. A C 3 3 # Sada D F G /E 4 Problema C: Shellsort Arquivo: shellsort.[c|cpp|java] O Rei Yertle deseja rearranjar o seu trono para colocar os seus maiores nobre e conselheiro mais ntimos prximos do topo. Apenas uma operao est disponvel para alterar a ordem das tartarugas: uma tartaruga pode escalar de sua posio e sentar no topo. Dada uma ordem original de tartarugas e uma ordem desejada seu trabalho encontrar a mnima seqncia de operaes e rearranjar a ordem original para a ordem desejada. Entrada A primeira linha da entrada consiste em um nico inteiro k informando o nmero de casos de teste. Cada caso de teste consiste em um inteiro n informando o nmero de tartarugas seguido de n linhas descrevendo a ordem original. Cada linha contm o nome da tartaruga, iniciando com a tartaruga do topo descendo at a base. As tartarugas tem nomes nicos, a quais so strings de no mais do que oito caracteres compostos por caracteres alfa-numricos, espao e ponto ."). As prximas n linhas da entrada referem-se a ordem desejada para as tartarugas, novamente nomeando-as do topo at a base. Cada caso de teste consiste em extamente 2n + 1 no total. O nmero de tartarugas (n) dever ser menor ou igual a 200. 2 3 Yertle Duke of Earl Sir Lancelot Duke of Earl Yertle Sir Lancelot 9 Yertle Duke of Earl Sir Lancelot Elizabeth Windsor Michael Eisner Richard M. Nixon Mr. Rogers Ford Perfect Mack Yertle Richard M. Nixon Sir Lancelot Duke of Earl Elizabeth Windsor Michael Eisner Mr. Rogers Ford Perfect Mack Sada Para cada caso de teste, a sada consiste em uma seqncia de nomes de tartarugas, uma por linha, indicando a ordem na qual as tartarugas deixam suas posies para escalar at o topo. Esta sequncia 5 de operaes dever transformar a seqncia original na seqncia desejada e deve ser a mais curta possvel. Se mais de uma soluo soluo de menor tamanho for possvel, qualquer uma das solues pode ser reportada. Imprima uma linha branca depois de cada caso de teste. Duke of Earl Sir Lancelot Richard M. Nixon Yertle 6 Problema D: Back to the Future Arquivo: future.[c|cpp|java] Um grupo de amigos resolveu ir a Alemanha para apoiar a seleo brasileira em sua jornada gloriosa rumo ao hexa. Como as passagens areas e as estadias eram caras, cada um trouxe uma quantidade de dinheiro que julgou suciente para passar o ms com conforto e voltar para casa sem problemas. Porm, aps a bela campanha do Brasil na copa do mundo, o grupo de amigos se viu obrigado a gastar o dinheiro que tinha guardado para as etapas nais da copa com a famosa cerveja alem. As conseqncias de tais atos foram terrveis. Aps uma grande bebedeira, todos foram pegos pela polcia local dormindo na rua, e receberam multas pesadssimas. Alm disso, todos perderam suas passagens de volta. Devido a esses contratempos, a viagem de volta cou ameaada. De repente, eles descobriram que precisavam voltar para casa gastando a menor quantidade possvel de dinheiro. Analisando as rotas areas disponveis, os amigos notaram que em todas as rotas o nmero de assentos disponveis nos avies era sempre o mesmo. Porm, os preos das viagens entre uma cidade e outra eventualmente variavam bastante. Assustados com a possibilidade de no encontrar lugares suciente nos avies para que todos pudessem voltar e preocupados em gastar a menor quantidade possvel de dinheiro, o grupo de amigos resolveu pedir sua ajuda. Entrada O problema composto por vrias instncias. Cada instncia comea com uma linha comdois inteiros positivos n (2 n 100) e m (1 m 5000), onde n o nmero de cidades que pertencem s m rotas de vo consideradas. Os amigos querem ir da cidade 1 at a cidade n. Nas prximas m linhas so fornecidos triplas de inteiros A B C descrevendo a rota do avio (A e B) e o preo da passagem area por pessoa (C). Os valores de A e B esto entre 1 e n. As rotas so bidirecionais (ou seja, h um vo de A at B e um vo de B at A com preo C) e haver no mximo uma rota entre duas cidades. Na prxima linha so dados dois inteiros, D e K, onde D o nmero de amigos e K o nmero de assentos livres em cada vo. Cada rota s pode ser utilizada uma vez. 4 5 1 4 1 1 3 3 3 4 4 1 2 2 2 4 5 20 10 4 4 1 3 3 3 4 4 1 2 2 2 4 5 20 100 4 4 1 3 3 6 3 4 4 1 2 2 2 4 5 20 1 7 Sada Para cada instncia, imprima a linha Instancia k, onde k o nmero da instncia atual. Alm disso, imprima a menor quantidade possvel de dinheiro que os amigos 11 vo gastar para voltar ao Brasil (que est limitada por 1015). Caso no seja possvel escolher um conjunto de vos que levem todos para casa, imprima impossivel. Imprima uma linha em branco aps cada instncia. Instancia 1 80 Instancia 2 140 Instancia 3 impossivel 8 Problema E: Jugs Arquivo: jugs.[c|cpp|java] In the movie Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the fol- lowing puzzle. They were given a 3-gallon jug and a 5-gallon jug and were asked to ll the 5-gallon jug with exactly 4 gallons. This problem generalizes that puzzle. You have two jugs, A and B, and an innite supply of water. There are three types of actions that you can use: (1) you can ll a jug, (2) you can empty a jug, and (3) you can pour from one jug to the other. Pouring from one jug to the other stops when the rst jug is empty or the second jug is full, whichever comes rst. For example, if A has 5 gallons and B has 6 gallons and a capacity of 8, then pouring from A to B leaves B full and 3 gallons in A. A problem is given by a triple (Ca,Cb,N), where Ca and Cb are the capacities of the jugs A and B, respectively, and N is the goal. A solution is a sequence of steps that leaves exactly N gallons in jug B. The possible steps are fill A fill B empty A empty B pour A B pour B A success where "pour A B"means "pour the contents of jug A into jug B", and "success"means that the goal has been accomplished. You may assume that the input you are given does have a solution. Input Format Input to your program consists of a series of input lines each dening one puzzle. Input for each puzzle is a single line of three positive integers: Ca, Cb, and N. Ca and Cb are the capacities of jugs A and B, and N is the goal. You can assume 0 < Ca <= Cb and N <= Cb <=1000 and that A and B are relatively prime to one another. Required Output Format Output from your program will consist of a series of instructions from the list of the potential output lines which will result in either of the jugs containing exactly N gallons of water. The last line of output for each puzzle should be the line "success". Output lines start in column 1 and there should be no empty lines nor any trailing spaces. Sample Input 3 5 4 5 7 3 Sample Output fill B pour B A empty A 9 pour B A fill B pour B A success fill A pour A B fill A pour A B empty B pour A B success Comment - Por se tratar de um treino... The solution above views the set of jug content pairs as vertices in a graph, with an edge from one pair/vertex to another if and only if one of the pouring acts gets you from one conguration to the other. In that perspective, the algorithm above is just a breadth-rst search of the graph. A depth-rst search is ne too, and perhaps simpler with recursion, but this breadth-rst solution gives the shortest sequence of jug operations to achieve a result. 10 Problema F: Rectangles Arquivo: rectangles.[c|cpp|java] A specialist in VLSI design testing must decide if there are some components that cover each other for a given design. A component is represented as a rectangle. Assume that each rectangle is rectilinearly oriented (sides parallel to the x and y axis), so that the representation of a rectangle con- sists of its minimum and maximum x and y coordinates. Write a program that counts the rectangles that are entirely covered by another rectangle. The input le contains the text description of several sets of rectangles. The specication of a set consists of the number of rectangles in the set and the list of rectangles given by the minimum and maximum x and y coordinates separated by white spaces, in the format: num_rectangles xmin 1 xmax 1 ymin 1 ymax 1 xmin 2 xmax 2 ymin 2 ymax 2 .... xmin n xmax n ymin n ymax n The output should be printed on the standard output. For each given input data set, print one integer number in a single line that gives the result (the number of rectangles that are covered). Sample Input 3 100 101 100 101 0 3 0 101 20 40 10 400 4 10 20 10 20 10 20 10 20 10 20 10 20 10 20 10 20 Sample Output 0 4 11 Problem G: Circle Through Three Points Arquivo: circle3.[c|cpp|java] Your team is to write a program that, given the Cartesian coordinates of three points on a plane, will nd the equation of the circle through them all. The three points will not be on a straight line. The solution is to be printed as an equation of the form (x h) 2 + (y k) 2 = r 2 (1) and an equation of the form x 2 + y 2 + cx + dy e = 0 (2) Each line of input to your program will contain the x and y coordinates of three points, in the order A x , A y , B x , B y , C x , C y . These coordinates will be real numbers separated from each other by one or more spaces. Your program must print the required equations on two lines using the format given in the sample below. Your computed values for h, k, r, c, d, and e in Equations 1 and 2 above are to be printed with three digits after the decimal point. Plus and minus signs in the equations should be changed as needed to avoid multiple signs before a number. Plus, minus, and equal signs must be separated from the adjacent characters by a single space on each side. No other spaces are to appear in the equations. Print a single blank line after each equation pair. Sample input 7.0 -5.0 -1.0 1.0 0.0 -6.0 1.0 7.0 8.0 6.0 7.0 -2.0 Sample output (x - 3.000)^2 + (y + 2.000)^2 = 5.000^2 x^2 + y^2 - 6.000x + 4.000y - 12.000 = 0 (x - 3.921)^2 + (y - 2.447)^2 = 5.409^2 x^2 + y^2 - 7.842x - 4.895y - 7.895 = 0 12 A B C R 13