Algoritmo em JAVA

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

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.

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 = (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();
   }
        
    }

}[/code]

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;
}