Advertisement
Guest User

Untitled

a guest
Feb 19th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. package pds01;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * Esta classe simula uma Sopa de Letras. Permite-nos receber uma grelha de jogo
  7. * e resolvê-la
  8. * @author grupo22
  9. *
  10. */
  11. public class SopaLetras {
  12. private char[][] grelha; //guarda a grelha de jogo
  13. private int linha; //serve como uma das coordenadas do ponto de partida da pesquisa
  14. private int col; // serve como uma das coordenadas do ponto de partida
  15. private int pesquisa_linha; //coordenada que será utilizada durante a procura da palavra
  16. private int pesquisa_col; //coordenada que será utilizada durante a procura da palavra
  17. private List<String> palavras; //palavras a serem procuradas
  18. /**
  19. * Constrói uma Sopa de Letras com a grelha especificada e a lista de palavras a procurar
  20. * @param grelha grelha de letras usada para jogar
  21. * @param palavras Lista de palavras a serem procuradas na sopa de letras
  22. */
  23. public SopaLetras(char[][] grelha, List<String> palavras){
  24. this.palavras = palavras;
  25. this.grelha=grelha;
  26. this.linha=0;
  27. this.col=0;
  28. }
  29.  
  30. public void solver() {
  31. palavras.forEach(e -> procurar(e));
  32. }
  33.  
  34. public void solverCronometrado() {
  35. long startTime = System.nanoTime();
  36. solver();
  37. long endTime = System.nanoTime();
  38.  
  39. double duration = (endTime - startTime)/1000000000.0;
  40. System.out.printf("Elapsed time (secs): %6.4f\n", duration);
  41. }
  42.  
  43. /**
  44. * Este método procura, na grelha de jogo, uma letra
  45. * correspondente à primeira letra da palavra
  46. * para que se possa efetuar a procura da palavra. O método
  47. * irá atualizar a linha e coluna onde o caracter se encontra
  48. * para servir de ponto de partida
  49. * @param word Palavra a ser procurada
  50. * @return true se o primeiro caracter da palavra estiver na grelha;
  51. * false, caso contrário
  52. */
  53. private boolean primeiraLetra(String word){
  54. //percorrer grelha até encontrar uma letra que corresponde à primeira letra da palavra especificada
  55. for(int i=linha;i<grelha.length;i++){
  56. for(int j=col;j<grelha[i].length;j++){
  57. if(word.charAt(0)==grelha[i][j]){
  58. //atualizar coordenadas quando encontrada a letra pretendida
  59. linha = i;
  60. col = j;
  61. pesquisa_linha=i;
  62. pesquisa_col=j;
  63. return true;
  64. }
  65. }
  66. }
  67. return false;
  68. }
  69.  
  70. /**
  71. * Este método usa os valores da coluna e linha de procura atualizados
  72. * pelo método primeiraLetra como ponto de partida. A partir dessas coordenadas,
  73. * irá procurar a palavra especificada na direção especificada
  74. * @param word Palavra a ser procurada
  75. * @param tipe Direção para a qual a palavra será procurada na grelha
  76. * @return true se a palavra for encontrada; false, caso contrário
  77. */
  78. public boolean procurar_palavra(String word, Direction tipe){
  79. String temp="";
  80. int c=0;
  81. while(pesquisa_linha>=0 && pesquisa_col>=0 && pesquisa_linha<grelha.length && pesquisa_col<grelha.length && c<word.length()){
  82. //contruir palavra temporária para avaliação posterior
  83. temp+=grelha[pesquisa_linha][pesquisa_col];
  84. direction(tipe);
  85. c++;
  86.  
  87. }
  88.  
  89. //se a palavra temporária corresponder à palavra especificada, retornar true
  90. if(word.equalsIgnoreCase(temp)){
  91. return true;
  92. }
  93. return false;
  94. }
  95.  
  96. /**
  97. * Este método traduz a direção recebida para a forma como a grelha de jogo
  98. * será percorrida. Ou seja, irá atualizar a linha e/ou coluna de pesquisa
  99. * consoante a direção recebida
  100. * @param tipe Direção pela qual se percorrerá a grelha
  101. */
  102. public void direction(Direction tipe){
  103. switch(tipe){
  104. case left:
  105. pesquisa_col--;
  106. break;
  107. case downleft:
  108. pesquisa_col--;
  109. pesquisa_linha++;
  110. break;
  111. case upleft:
  112. pesquisa_col--;
  113. pesquisa_linha--;
  114. break;
  115. case right:
  116. pesquisa_col++;
  117. break;
  118. case upright:
  119. pesquisa_col++;
  120. pesquisa_linha--;
  121. break;
  122. case downright:
  123. pesquisa_col++;
  124. pesquisa_linha++;
  125. break;
  126. case down:
  127. pesquisa_linha++;
  128. break;
  129. case up:
  130. pesquisa_linha--;
  131. break;
  132. }
  133.  
  134. }
  135.  
  136. /**
  137. * Este método irá fazer uso dos métodos primeiraLetra() e avaliar()
  138. * para procurar a palavra especificada.
  139. * @param word Palavra a ser procurada
  140. */
  141. public void procurar(String word){
  142. //flag servirá para verificar se a palavra foi encontrada ou não
  143. boolean flag = false;
  144. while(!flag){
  145. primeiraLetra(word); //procurar primeira letra da palavra na grelha
  146.  
  147. /*
  148. * usar as coordenadas determinadas anteriormente como ponto de partida
  149. * para procurar a palavra em todas as direções
  150. */
  151. flag = avaliar(word,Direction.left) || avaliar(word,Direction.downleft) || avaliar(word,Direction.upleft) || avaliar(word,Direction.right) || avaliar(word,Direction.downright) || avaliar(word,Direction.upright) || avaliar(word,Direction.up) || avaliar(word,Direction.down);
  152. //sair do ponto de partida anterior para continuar a procura
  153. if(col<grelha.length){
  154. col++;
  155. }else if(linha<grelha.length){
  156. linha++;
  157. col=0;
  158. }else{
  159. System.out.println("Não encontrou");
  160. break;
  161. }
  162. }
  163.  
  164. }
  165.  
  166. /**
  167. * Este método irá imprimir a palavra e os resultados da sua procura,
  168. * caso a palavra seja encontrada.
  169. * @param word Palavra a ser procurada
  170. * @param tipe Direção pela qual a grelha é percorrida
  171. * @return true se a palavra for encontrada; false, caso contrário
  172. */
  173. public boolean avaliar(String word, Direction tipe){
  174. if(procurar_palavra(word,tipe)){
  175. System.out.printf("%-10s%-5d%d,%d%10s\n",word.toUpperCase(),word.length(),linha,col,tipe);
  176. linha = 0;
  177. col = 0;
  178. return true;
  179. }else{
  180. //se palavra não for encontrada, voltar ao ponto de partida para procurar noutra direção
  181. pesquisa_linha = linha;
  182. pesquisa_col = col;
  183. return false;
  184. }
  185. }
  186.  
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement