Snake and Ladder Problem

Given a snake and ladder board, find the minimum number of dice throws required to reach the destination or last cell from source or 1st cell. Basically, the player has total control over outcome of dice throw and wants to find out minimum number of throws required to reach last cell.

If the player reaches a cell which is base of a ladder, the player has to climb up that ladder and if reaches a cell is mouth of the snake, has to go down to the tail of snake without a dice throw.

O(n) BFS

/**
 * Given a snake and ladder board, find the minimum number of dice throws required to reach the destination or last cell from source or 1st cell. Basically, the player has total control over outcome of dice throw and wants to find out minimum number of throws required to reach last cell.
 * If the player reaches a cell which is base of a ladder, the player has to climb up that ladder and if reaches a cell is mouth of the snake, has to go down to the tail of snake without a dice throw.
 * @author
 */
import java.util.*;
class Grid{
    int index;
    int distance;
    public Grid(int index, int distance){
        this.index = index;
        this.distance = distance;
    }
}
public class SnakeAndLadderProblem {

    public static int miniStep(int[] board){
        int min = 0;
        boolean visited[] = new boolean[board.length];
        Queue<Grid> queue = new LinkedList<Grid>();
        Grid root = new Grid(0,0);
        visited[0] = true;
        queue.offer(root);
        while(!queue.isEmpty()){
            Grid top = queue.poll();
            if(top.index == board.length -1){
                min = top.distance;
                break;
            }
            for(int i = top.index + 1; i <= top.index + 6 && i < board.length; i++){
                if(visited[i] == false){
                    Grid newGrid  = null;
                    visited[i] = true;                 
                    if(board[i] !=-1)
                         newGrid = new Grid(board[i], top.distance + 1);
                    else
                         newGrid = new Grid(i, top.distance + 1);
                    queue.add(newGrid);
                }
            }    
        }
        return min;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int board[] = new int[30];
        for(int i = 0; i < 30; i++){
            board[i] = -1;
        }
        // Ladders
                board[2] = 21;
                board[4] = 7;
                board[10] = 25;
                board[19] = 28;

        // Snakes
                board[26] = 0;
                board[20] = 8;
                board[16] = 3;
                board[18] = 6;
       System.out.println("min step is "+ miniStep(board));
    }

}

 

转载于:https://www.cnblogs.com/joannacode/p/6012962.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值