Search code examples
cchess

Chess Board Problems


There is a chess board of dimension n * n. You are given with 2 squares on that board S(x1,y1) ;M(x2,y2). S is a fixed point. M can move diagonally. It can move any number of steps or jumps in 1 move . Find the minimum number of moves M needs to reach S

My Approach: We can just count diagonal blocks, But I'm confused with jumps. Can anybody explain what they meant by jumps?


Solution

  • I think jump here refers to the case when the chess the piece can move diagonally more than 1 step. Example if at (1,1) then it can go to (3,3) in a single step.

    I have coded a bactracking algorithm assuming the above case. The basic idea here to get all possible moves to reach the destination (x,y) co-ordinate. It checks all valid moves at a given position and prints the path followed to reach here. construct_candidates() will give you all valid candidate co-ordinates for the current position. It checks the bounds and also validates we have not visited the chess block earlier, if these conditions are satisfied, then it is a valid candidate for the move.

    You can easily modify it to keep track of the shortest possible path followed.

    #define N 4 /* Chess Board Dimension */
    #define TRUE     1   
    #define FALSE    0
    
    #define START_X  0
    #define START_Y  0
    #define TARGET_X 1
    #define TARGET_Y 3
    
    typedef short int bool;
    
    typedef struct point_ {
        int x;
        int y;
    } point_t;
    
    
    bool is_candidate_valid (point_t *a, int k, int new_x, int new_y)
    {
        int i;
        /* Check bounds */
        if ((new_x < 0) || (new_x > (N-1)) ||
            (new_y < 0) || (new_y > (N-1))) {
            return FALSE;
        }
    
        /* Check if this new position is already in the path followed */
    
        for (i = 0; i < k; i++) {
            if (a[i].x == new_x && a[i].y == new_y) {
                return FALSE;
            }
        }
        return TRUE;
    }
    
    void construct_candidates (point_t *a, int k, point_t *candidates, int *n_candidates)
    {
        int delta;
        *n_candidates = 0;
        int new_x, new_y;
    
        for (delta = 1; delta <= (N-1); delta++)  {
    
            new_x = a[k-1].x + delta;
            new_y = a[k-1].y + delta;
    
            if (is_candidate_valid (a, k, new_x, new_y) == TRUE) {
                 candidates[*n_candidates].x = new_x;
                 candidates[*n_candidates].y = new_y;
                 (*n_candidates)++;
            }
    
            new_x = a[k-1].x + delta;
            new_y = a[k-1].y - delta;
    
            if (is_candidate_valid (a, k, new_x, new_y) == TRUE) {
                 candidates[*n_candidates].x = new_x;
                 candidates[*n_candidates].y = new_y;
                 (*n_candidates)++;
            }
    
            new_x = a[k-1].x - delta;
            new_y = a[k-1].y + delta;
    
            if (is_candidate_valid (a, k, new_x, new_y) == TRUE) {
                 candidates[*n_candidates].x = new_x;
                 candidates[*n_candidates].y = new_y;
                 (*n_candidates)++;
            }
    
            new_x = a[k-1].x - delta;
            new_y = a[k-1].y - delta;
    
            if (is_candidate_valid (a, k, new_x, new_y) == TRUE) {
                 candidates[*n_candidates].x = new_x;
                 candidates[*n_candidates].y = new_y;
                 (*n_candidates)++;
            }
        }
    }
    
    bool is_a_solution (point_t *a, int k)
    {
        if (a[k-1].x == TARGET_X && a[k-1].y == TARGET_Y) {
            return TRUE; /* Actual Solution found */
        }
        if (k == (N*N)) {
            return TRUE; /* No Solution found */
        }
        return FALSE;
    }
    
    void process_solution (point_t *a, int k)
    {
        int i;
    
        if (k == (N*N)) {
            return; /* No solution Possible */
        }
    
        for (i = 0; i < k; i++) {
            printf ("(%d, %d) ", a[i].x, a[i].y);
        }
        printf ("\n");
    }
    
    
    void backtrack (point_t *a, int k)
    {
        int i, n_candidates;
        point_t candidates[4*(N-1)];
    
        if (is_a_solution (a, k) == TRUE) {
            process_solution (a, k);
            return;
        }
    
        construct_candidates (a, k, candidates, &n_candidates);
        for (i = 0; i < n_candidates; i++) {
            a[k].x = candidates[i].x;
            a[k].y = candidates[i].y;
    
            backtrack (a, k + 1);
        }
    }
    
    int main()
    {
        point_t a[N*N];
        /* Fill up the initial position */
        a[0].x = START_X;
        a[0].y = START_Y;
    
        backtrack (a, 1);
    }
    
    Output:   
    
    (0, 0) (1, 1) (2, 2) (3, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (1, 1) (2, 2) (3, 1) (1, 3) 
    (0, 0) (1, 1) (2, 2) (1, 3) 
    (0, 0) (1, 1) (2, 0) (3, 1) (2, 2) (1, 3) 
    (0, 0) (1, 1) (2, 0) (3, 1) (1, 3) 
    (0, 0) (1, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (1, 1) (0, 2) (1, 3) 
    (0, 0) (1, 1) (0, 2) (2, 0) (3, 1) (2, 2) (1, 3) 
    (0, 0) (1, 1) (0, 2) (2, 0) (3, 1) (1, 3) 
    (0, 0) (1, 1) (3, 3) (2, 2) (3, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (1, 1) (3, 3) (2, 2) (3, 1) (1, 3) 
    (0, 0) (1, 1) (3, 3) (2, 2) (1, 3) 
    (0, 0) (2, 2) (3, 3) (1, 1) (2, 0) (3, 1) (1, 3) 
    (0, 0) (2, 2) (3, 3) (1, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (2, 2) (3, 3) (1, 1) (0, 2) (1, 3) 
    (0, 0) (2, 2) (3, 3) (1, 1) (0, 2) (2, 0) (3, 1) (1, 3) 
    (0, 0) (2, 2) (3, 1) (2, 0) (1, 1) (0, 2) (1, 3) 
    (0, 0) (2, 2) (3, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (2, 2) (3, 1) (1, 3) 
    (0, 0) (2, 2) (1, 3) 
    (0, 0) (2, 2) (1, 1) (2, 0) (3, 1) (1, 3) 
    (0, 0) (2, 2) (1, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (2, 2) (1, 1) (0, 2) (1, 3) 
    (0, 0) (2, 2) (1, 1) (0, 2) (2, 0) (3, 1) (1, 3) 
    (0, 0) (3, 3) (2, 2) (3, 1) (2, 0) (1, 1) (0, 2) (1, 3) 
    (0, 0) (3, 3) (2, 2) (3, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (3, 3) (2, 2) (3, 1) (1, 3) 
    (0, 0) (3, 3) (2, 2) (1, 3) 
    (0, 0) (3, 3) (2, 2) (1, 1) (2, 0) (3, 1) (1, 3) 
    (0, 0) (3, 3) (2, 2) (1, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (3, 3) (2, 2) (1, 1) (0, 2) (1, 3) 
    (0, 0) (3, 3) (2, 2) (1, 1) (0, 2) (2, 0) (3, 1) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 2) (3, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 2) (3, 1) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 0) (3, 1) (2, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 0) (3, 1) (1, 3) 
    (0, 0) (3, 3) (1, 1) (2, 0) (0, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (0, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (0, 2) (2, 0) (3, 1) (2, 2) (1, 3) 
    (0, 0) (3, 3) (1, 1) (0, 2) (2, 0) (3, 1) (1, 3)