Passeio do cavalo, questão 7.22 b), Deitel

1 resposta
C

Bom dia pessoal,

Estou tentando resolver a letra b) da questão 7.22 e agradeceria imenso se alguém não se importasse de tirar uma pequena dúvida minha:

7.22(Passeio do cavalo) Um problema interessante para os fãs de xadrez é o problema do ‘passeio do cavalo’, originalmente proposto pelo matemático Euller. A peça do cavalo pode mover-se em um tabuleiro vazio e tocar cada um dos 64 quadrados somente uma única vez. Aqui, estudamos esse intrigante problema em profundidade.

O cavalo só faz movimentos em forma de L (dois espaços em uma direção e outro em direção perpendicular). Portanto partindo de um quadrado próximo do centro de um tabuleiro de xadrez vazio, o cavalo (rotulado K) pode fazer oito movimentos diferentes (numerados de 0 a 7).

b) Agora vamos desenvolver um aplicativo que moverá o cavalo pelo tabuleiro. O tabuleiro é representado por um array bidimensional oito por oito ‘board’. Cada quadro é inicializado como zero. Descrevemos cada um dos oito movimentos possíveis em termos de seus componentes vertical e horizontal. Por exemplo, um movimento do tipo 0 consiste em mover dois quadrados horizontalmente para a direita e um quadrado verticalmente para cima. Um movimento do tipo 2 consiste em mover um quadrado horizontalmente para a esquerda e dois quadrados verticalmente para cima. Movimentos horizontais para a esquerda e movimentos verticais para cima são indicados com números negativos. Os oitos movimentos podem ser descritos por dois arrays unidimensionais, ‘horizontal’ e ‘vertical’, como segue:

horizontal[ 0 ] =  2        vertical[ 0 ] = -1  
             horizontal[ 1 ] =  1        vertical[ 1 ] = -2  
             horizontal[ 2 ] = -1        vertical[ 2 ] = -2  
             horizontal[ 3 ] = -2        vertical[ 3 ] = -1  
             horizontal[ 4 ] = -2        vertical[ 4 ] =  1  
             horizontal[ 5 ] = -1        vertical[ 5 ] =  2  
             horizontal[ 6 ] =  1        vertical[ 6 ] =  2  
             horizontal[ 7 ] =  2        vertical[ 7 ] =  1

Faça com que as variáveis currentRow e currentColumn indiquem, respectivamente, a linha e a coluna da posição atual do cavalo. Para fazer um movimento do tipo moveNumber, que que moveNumber está entre 0 e 7, seu aplicativo deve utilizar as instruções:

currentRow += vertical[ moveNumber ];  
             currentColumn += horizontal[ moveNumber ];

Escreva um aplicativo para mover o cavalo pelo tabuleiro. Mantenha um contador que varia de 1 para 64. Registre a última contagem em cada quadrado para que o cavalo se move. Teste cada movimento potencial para assegurar que o cavalo não saia fora do tabuleiro. Execute o aplicativo. Quantos movimentos o cavalo fez ?

Bom, a minha dúvida é: Nesta letra b), o aplicativo pedido necessariamente não fará o cavalo percorrer todos os quadrados do tabuleiro, ou seja, o contador provavelmente não irá chegar até 64, não é isso!?

Agradeço muito se alguém me tirar essa dúvida.

1 Resposta

C

Eu posto aqui o código-fonte do que fiz para quem quiser dar uma olhada. Nesse código, o cavalo nunca percorrerá as 64 casas.

package pkg722;

public class Cavalo
{
    private int contador = 1; //Conta o número de casas.
    private int moveNumber = 0; //Índice dos arrays h e v.
    private int coorX = 0; //Linha da posicao atual do cavalo.
    private int coorY = 0; //Coluna da posicao atual do cavalo.
    int[] h = {2, 1, -1, -2, -2, -1, 1, 2};//Movimento horizontal do cavalo.
    int[] v = {-1, -2, -2, -1, 1, 2, 2, 1};//Movimento vertical do cavalo.
    private int[][] board = new int[8][8];//Tabuleiro do passeio do cavalo.
    //
    public void Passeio()
    {
        board[coorX][coorY] = 1; 
        while(true)
        {
            if( (coorX + v[moveNumber] >=0 && coorY + h[moveNumber] >= 0) && 
                    (coorX + v[moveNumber] <=7 && coorY + h[moveNumber] <= 7))
            {
                if(board[coorX + v[moveNumber]][coorY + h[moveNumber]] == 0)
                {
                    coorX = coorX + v[moveNumber];
                    coorY = coorY + h[moveNumber];  
                    board[coorX][coorY] = ++contador;
                }
            }
            moveNumber++;
            if(moveNumber > 7)
                moveNumber = 0;
            if (contador == 64)
                break;
            Tabuleiro();
        }
        
    }
    //
    public void Tabuleiro()
    {
        for(int i=0; i< board.length; i++)
        {
            System.out.println();
            for(int j=0; j< board[i].length; j++)
                System.out.printf("\t%d ",board[i][j]);
        }
        System.out.println();
    }
}

package pkg722;
public class Main
{
    public static void main(String[] args) 
    {
        Cavalo cavalo = new Cavalo();
        cavalo.Passeio();
    }
}
Criado 2 de março de 2012
Ultima resposta 3 de mar. de 2012
Respostas 1
Participantes 1