65 for (
int j = 0; j <
inst.
M; j++)
66 for (
int i =
inst.
N - 1; i >= 0; i--)
67 if (
Casa(i, j) ==
'.') {
79 int nMax = 0, nMin = 0;
83 i += di, j += dj, k++)
87 case 'x': nMin++;
break;
88 case 'o': nMax++;
break;
90 if (k >=
inst.
K - 1) {
96 case 'x': nMin--;
break;
97 case 'o': nMax--;
break;
108 for (
int linha = 0; linha <
inst.
N; linha++)
115 for (
int coluna = 0; coluna <
inst.
M; coluna++)
137 printf(
" gravidade");
140 for (
int i = 0; i <
inst.
M; i++)
141 printf(
" %c",
'A' + i);
142 for (
int i = 0; i <
inst.
N; i++) {
144 printf(
"%2d", i + 1);
145 for (
int j = 0; j <
inst.
M; j++)
146 printf(
" %c",
Casa(i, j));
147 printf(
" %d ", i + 1);
151 for (
int i = 0; i <
inst.
M; i++)
152 printf(
" %c",
'A' + i);
220 for (
int i = 0, index = 0; i <
inst.
N *
inst.
M; i++, index += 2)
226 static int index[][2] = { {0,1},{1,0}, {1,1}, {1,-1} };
228 int nMax, nMin, suspensas;
240 for (
int linha = 0; linha <
inst.
N; linha++) {
241 for (
int coluna = 0; coluna <
inst.
M; coluna++) {
242 for (
int dir = 0; dir < 4; dir++) {
243 if ((index[dir][0] > 0 ? linha <=
inst.
N -
inst.
K : 1) &&
244 (index[dir][1] > 0 ? coluna <=
inst.
M -
inst.
K :
245 index[dir][1] < 0 ? coluna >=
inst.
K - 1 : 1))
247 suspensas = nMax = nMin = 0;
248 for (
int i = 0; i <
inst.
K && (nMax == 0 || nMin == 0); i++)
249 if (
Casa(linha + i * index[dir][0], coluna + i * index[dir][1]) ==
'x')
251 else if (
Casa(linha + i * index[dir][0], coluna + i * index[dir][1]) ==
'o')
254 int l = linha + i * index[dir][0];
255 while (l <
inst.
N - 1 &&
256 Casa(l + 1, coluna + i * index[dir][1]) ==
'.') {
263 if (nMax ==
inst.
K) {
267 else if (nMin ==
inst.
K) {
279 if (nMin < 0 || nMax < 0)
289 if (nMax > 0 && nMin == 0)
290 qMax[
inst.
K - 1 - nMax]++;
291 else if (nMin > 0 && nMax == 0)
292 qMin[
inst.
K - 1 - nMin]++;
@ HEUR_BASE
valor base para diferença entre ameaças de K e K-1 (100 não há diferença, 200 é o valor por omissão)
@ ORDENAR_SUCESSORES
opção de ordenar sucessores por heurística, ou por último valor registado
@ LIMITE
Valor dependente do algoritmo. Exemplo: Profundidade limitada.
@ BARALHAR_SUCESSORES
Baralhar os sucessores ao expandir.
@ RUIDO_HEURISTICA
Ruído a adicionar à heurística para testes de robustez.
@ ALGORITMO
Algoritmo base a executar.
@ LIMITE_TEMPO
Tempo limite em segundos.
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
TString Acao(TNo sucessor)
Retorna a ação (movimento, passo, jogada, lance, etc.) que gerou o sucessor.
void TesteManual(TString nome)
Inicializa a interação com o utilizador.
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
TVector< char > tabuleiro
void Copiar(TProcuraConstrutiva *objecto)
bool VerLinha(int i, int j, int di, int dj)
void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
void SetBits(uint64_t value, int bitIndex, int bitCount)
int MaiorAmeaca(TVector< int > &qMin, TVector< int > &qMax, int maxAmeaca) const
Utilitário para calculo de uma heurística standard em jogos simples.
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
bool minimizar
o jogador actual deve minimizar o custo (ou maximizar caso tenha o valor falso)
int Heuristica(void)
chamar após calcular a heurística (grava o valor, dependendo da parametrização)
bool ExisteHeuritica(void)
void ResetParametros()
Método para inicializar os parâmetros (redefinir se forem adicionados parâmetros específicos)
static int infinito
valor de infinito (vitoria/derrota), omissao 1000
static int resultadoCompleto
resultado após SolucaoCompleta() retornar true (-1 vitória minimizar, 0 empate, 1 vitória maximizar)
Representa um estado no espaço de estados.
void NovaLinha(bool tudo=true)
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
int Parametro(int id) const
static TVector< TVector< int > > configuracoes
Conjuntos de configurações para teste empírico.
virtual void TesteManual(TString nome)
Inicializa a interação com o utilizador.
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
TString & printf(const char *fmt,...)
TVector< Item > & Reset(Item const &i)
Preenche todo o vetor com um mesmo valor.
void Inicializar(void) override
Coloca o objecto no estado inicial da procura.
virtual void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
int heuristica
Estimativa para o custo até um estado objetivo, se disponível.
int valor
valor do parâmetro