#include #include #include #include int **FazTabuleiroVazio (m, n) { int **tabuleiro; // ponteiro para a matriz int i, j, k; // variavel auxiliar // aloca as linhas da matriz tabuleiro = (int **) calloc (m+1, sizeof(int *)); if (tabuleiro == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } /* aloca as colunas da matriz */ for ( i = 0; i < m; i++ ) { tabuleiro[i] = (int*) calloc (n+1, sizeof(int)); if (tabuleiro[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } } k = 0; while (k < m){ j=0; if (k % 2 == 0){ while (j < n){ tabuleiro[k][j] = 0; j++; tabuleiro[k][j] = 4; j++; } k++; } else{ while (j < n){ tabuleiro[k][j] = 4; j++; tabuleiro[k][j] = 0; j++; } k++; } } return (tabuleiro); } void ImprimeTabuleiro(int m, int n, int **tabuleiro){ int i, j; for (i=0;i b) return a; //se a é maior que b, a será o valor máximo else return b; //do contrário, b será o máximo } int verificaJogada (int m, int n, int i, int j, int iComida, int jComida, int **tabuleiro, int visitado[100][100]) { // retorna se i está entre 0 e m, se j está entre 0 e n (ou seja, se eles não são limites do tabuleiro) // retorna se a posição a ser analizada não foi visitada // retorna se a posição do tabuleiro é válida e se a peça a ser comida é 2 return (i < m && j < n && i >= 0 && j >= 0 && visitado[iComida][jComida] != 1 && tabuleiro[i][j] == 0 && tabuleiro[iComida][jComida] == 2); } int contaJogadas(int m, int n, int i, int j, int **tabuleiro, int visitado[100][100]){ int maximo = 0; //verifica se é possível comer para a direita para cima if (verificaJogada(m, n, i + 2, j + 2, i + 1, j + 1, tabuleiro, visitado)) { //o lugar da peça comida recebe 1 indicando que foi visitado, para que não seja válido comer a mesma peça visitado[i + 1][j + 1] = 1; /*a função é chamada recursivamente, e maximo recebe o maior numero entre essa chamada e o próprio máximo, é adicionado 1 a contaJogadas pois a jogada anterior foi válida e deve ser contada. agora uma nova analise de movimento começa, como se a peça 1 estivesse em i+2 e a peça 2 em j-2 */ maximo = max(1 + contaJogadas(m, n, i + 2, j + 2, tabuleiro, visitado), maximo); visitado[i + 1][j + 1] = 0; } //verifica se é possível comer para a direita para baixo if (verificaJogada(m, n, i - 2, j + 2, i - 1, j + 1, tabuleiro, visitado)) { visitado[i - 1][j + 1] = 1; maximo = max(1 + contaJogadas(m, n, i - 2, j + 2, tabuleiro, visitado), maximo); visitado[i - 1][j + 1] = 0; } //verifica se é possível comer para a esquerda para cima if (verificaJogada(m, n, i + 2, j - 2, i + 1, j - 1, tabuleiro, visitado)) { visitado[i + 1][j - 1] = 1; maximo = max(1 + contaJogadas(m, n, i + 2, j - 2, tabuleiro, visitado), maximo); visitado[i + 1][j - 1] = 0; } //verifica se é possivel comer para a esquerda para baixo if (verificaJogada(m, n, i - 2, j - 2, i - 1, j - 1, tabuleiro, visitado)) { visitado[i - 1][j - 1] = 1; maximo = max(1 + contaJogadas(m, n, i - 2, j - 2, tabuleiro, visitado), maximo); visitado[i - 1][j - 1] = 0; } return maximo; } int casasDisponiveis(int *m, int *n){ return((1 + *m * *n)/2); } int **liberar_tabuleiro (int m, int n, int **v){ int i; /* variavel auxiliar */ if (v == NULL) return (NULL); if (m < 1 || n < 1) { /* verifica parametros recebidos */ printf ("** Erro: Parametro invalido **\n"); return (v); } for (i=0; i