Organizar permuta numa lista de caracteres

Tenho uma lista contendo vários objetos da classe Caractere, onde cada caractere pode escolher de um até três destinos possíveis, a troca pode ocorrer caso tenha alguém que deseja o local atual do mesmo ou que através de outra permuta uma vaga seja liberada, sendo que é seguido a ordem da lista por prioridade.

"A", ["B", "Y", "Z"];
"B", ["C", "X"];
"C", ["A"];
"T", ["B"];
"H", ["B", "K", "Z"];
"K", ["H", "A"];
"M", ["U", "F"];
"O", ["G"];
"E", ["V", "C"];
"Z", ["A"].

O resultado esperado para os itens da lista:

A conseguiu para B.
B conseguiu para C.
C conseguiu para A.
T não conseguiu ir pra nenhum lugar.
H conseguiu para K.
K conseguiu para H.
M não conseguiu ir pra nenhum lugar.
O não conseguiu ir pra nenhum lugar.
E não conseguiu ir pra nenhum lugar.
Z não conseguiu ir pra nenhum lugar.

Leitura inicial: “A” procura por outros Caracteres que possuem locais atuais que sejam “B”, “Y” ou “Z”, o segundo item possui o local atual “B”, porém ele não deseja ir para “A”, e sim para “C” ou “X”, verifico então “B”, a primeira opção é “C”, o terceiro item possui o local atual “C” e deseja ir para “A”, ou seja, pode haver uma troca de locais entre os três. …

A lista segue a ordem de prioridade e não por eficiência, o que ocorrer primeiro “ganha”.

public class Caractere {
private String localAtual;
private String[] destinos;


}

A lista é extensa e consegui diminuí-la removendo os Caracteres que não tinham locais atuais e destinos possíveis.

Porém estou com dificuldades para rastrear as combinações, pois como no exemplo que citei:

caso uma permuta não ocorra as outras não serão possíveis.

Existe alguma fórmula matemática pra resolver esse problema ou como poderia fazer essa checagem?

Obs: Não é nenhum trabalho/tarefa de faculdade/curso, não quero um código e sim uma ideia de como implementar um algoritmo.