Algoritmo em JAVA

3 respostas
N

Não estou conseguindo resolver esta questão. Tá complicado.

Faça uma função em Java que receba uma string por parâmetro e retorne um array de caracteres bidimensional. O array resultante deve conter o conteúdo da string distribuído em formato espiral. O primeiro caracter deve ser colocado no canto superior esquerdo do array e prosseguir no sentido horário. A função deve retornar o array de menor tamanho possível que possa acomodar a string. Espaços não utilizados devem ser preenchidos com um “.” (ponto).

Exemplo do retorno:

f(“abc”)

a b
. c

f(“abcd”)

a b
d c

f(“abcde”)

a b c
. . d
. . e

f(“Rodrigo Matias Leote”)

R o d r i
L e o t g
. . e o
s . . .
a i t a M

3 Respostas

A

O que você já tem até o momento? Seja mais específico em sua dúvidas.

O propósito do fórum é o de ajudar e não de resolver…

O que você fez até o momento? Posta aí…

Obrigado.

N

Isso é o que tenho feito.
Porém eu achei muito manual. Gostaria que me ajudassem a encontrar uma forma mais lógica de fazer isso. Vejam que estou alocando cada caracter em sua posição, muito manualmente.

import java.io.*;
import java.lang.Math;
public class Espiral {
    public static void main(String[][] args)throws IOException {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        String nome = stdin.readLine();
        int tamanhoEspiral = (int)Math.sqrt(nome.length());
        String[][] espiral = new String[tamanhoEspiral][tamanhoEspiral];
        int numeroPontos = (tamanhoEspiral*tamanhoEspiral)-nome.length();
        while (numeroPontos>0) {
            nome = nome+".";
            numeroPontos--;
        }
        
       int cont = 0, linha = 0, coluna = 0, limiteMin = 0, limiteMax = tamanhoEspiral-1; 
       while(cont<nome.length()){
            if(linha == limiteMin){
                while(coluna<limiteMax) {
                    espiral[linha][coluna] = nome.substring(cont, cont+1);
                    coluna++;
                    cont++;
                }
                espiral[linha][coluna] = nome.substring(cont, cont+1);
                while(linha<limiteMax) {
                    espiral[linha][coluna] = nome.substring(cont, cont+1);
                    linha++;
                    cont++;
                }
                espiral[linha][coluna] = nome.substring(cont, cont+1);
                limiteMin++;
            } else {
                while(linha>limiteMin) {
                    espiral[linha][coluna] = nome.substring(cont, cont+1);
                    coluna--;
                    cont++;
                }
                espiral[linha][coluna] = nome.substring(cont, cont+1);
                while(linha<limiteMax) {
                    espiral[linha][coluna] = nome.substring(cont, cont+1);
                    linha--;
                    cont++;
                }
                espiral[linha][coluna] = nome.substring(cont, cont+1);
                limiteMax--;
                
            }
       }
       for(int i=0; i<tamanhoEspiral; i++)
       {
       	for(int h=0; h<tamanhoEspiral; h++)
       	{
       		System.out.print(espiral[i][h]+"    ");       		
       	}
       	System.out.println();
       }
            
        }
}
T

a) Use char em vez de string, e charAt para obter o caracter na posição n.

b) Acho que não dá para ficar muito menos "manual" que isso (a menos que use uns truques com contas, o que não é exatamente o que seu professor está pedindo). Estava pensando em uma analogia com uma tartaruga que vai percorrendo um labirinto e muda de direção quando encontra a parede, mas é exatamente isso que você faz.

c) Quando você fez "Math.sqrt(nome.length())" você vai alocar sempre um vetor de tamanho menor ou igual ao necessário. O correto é fazer algo como:

private static int retornaDimensao (int comprimento) {
    int raiz = Math.sqrt (comprimento);
    if (comprimento - raiz * raiz &gt 0) {
         raiz = raiz + 1;
    }
    return raiz;
}
Criado 6 de novembro de 2006
Ultima resposta 6 de nov. de 2006
Respostas 3
Participantes 3