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).
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.
[code]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 = (tamanhoEspiraltamanhoEspiral)-nome.length();
while (numeroPontos>0) {
nome = nome+".";
numeroPontos–;
}
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 > 0) {
raiz = raiz + 1;
}
return raiz;
}