Knight's Shortest Path on Chessboard

后端 未结 16 1296
情深已故
情深已故 2020-11-30 16:42

I\'ve been practicing for an upcoming programming competition and I have stumbled across a question that I am just completely bewildered at. However, I feel as though it\'s

16条回答
  •  既然无缘
    2020-11-30 17:19

    Just ruby code from Graeme Pyle's answer's jsfiddle above, striped all extra code and converted remaining to ruby just to get solution by his algorithm, seems like working. Still testing though:

    def getBoardOffset(board)
      return board.length / 2
    end
    
    def setMoveCount(x, y, count, board)
      offset = getBoardOffset(board)
      board[y + offset][x + offset] = count
    end
    
    def getMoveCount(x, y, board)
        offset = getBoardOffset(board)
        row = board[y + offset]
        return row[x + offset]
    end
    
    def isBottomOfVerticalCase(x, y)
        return (y - 2 * x) % 4 == 0
    end
    
    def isPrimaryDiagonalCase(x, y)
        return (x + y) % 2 == 0
    end
    
    def isSecondaryDiagonalCase(x, y)
        return (x + y) % 2 == 1
    end
    
    def simplifyBySymmetry(x, y)
        x = x.abs
        y = y.abs
        if (y < x)
          t = x
          x = y
          y = t
        end
        return {x: x, y: y}
    end
    
    def getPrimaryDiagonalCaseMoveCount(x, y)
        var diagonalOffset = y + x
        var diagonalIntersect = diagonalOffset / 2
        return ((diagonalIntersect + 2) / 3).floor * 2
    end
    
    def getSpecialCaseMoveCount(x, y)
        specials = [{
                x: 0,
                y: 0,
                d: 0
            },
            {
                x: 0,
                y: 1,
                d: 3
            },
            {
                x: 0,
                y: 2,
                d: 2
            },
            {
                x: 0,
                y: 3,
                d: 3
            },
            {
                x: 2,
                y: 2,
                d: 4
            },
            {
                x: 1,
                y: 1,
                d: 2
            },
            {
                x: 3,
                y: 3,
                d: 2
            }
        ];
        matchingSpecial=nil
        specials.each do |special|
          if (special[:x] == x && special[:y] == y)
            matchingSpecial = special
          end
        end
        if (matchingSpecial)
          return matchingSpecial[:d]
        end
    end
    
    def isVerticalCase(x, y)
      return y >= 2 * x
    end
    
    def getVerticalCaseMoveCount(x, y)
        normalizedHeight = getNormalizedHeightForVerticalGroupCase(x, y)
        groupIndex = (normalizedHeight/4).floor
        groupStartMoveCount = groupIndex * 2 + x
        return groupStartMoveCount + getIndexInVerticalGroup(x, y)
    end
    
    def getIndexInVerticalGroup(x, y)
        return getNormalizedHeightForVerticalGroupCase(x, y) % 4
    end
    
    def getYOffsetForVerticalGroupCase(x) 
        return x * 2
    end
    
    def getNormalizedHeightForVerticalGroupCase(x, y)
        return y - getYOffsetForVerticalGroupCase(x)
    end
    
    def getSecondaryDiagonalCaseMoveCount(x, y)
        diagonalOffset = y + x
        diagonalIntersect = diagonalOffset / 2 - 1
        return ((diagonalIntersect + 2) / 3).floor * 2 + 1
    end
    
    def getMoveCountO1(x, y)
        newXY = simplifyBySymmetry(x, y)
        x = newXY[:x]
        y = newXY[:y]
        specialMoveCount = getSpecialCaseMoveCount(x ,y)
        if (specialMoveCount != nil)
          return specialMoveCount
        elsif (isVerticalCase(x, y))
          return getVerticalCaseMoveCount(x ,y)
        elsif (isPrimaryDiagonalCase(x, y))
          return getPrimaryDiagonalCaseMoveCount(x ,y)
        elsif (isSecondaryDiagonalCase(x, y))
          return getSecondaryDiagonalCaseMoveCount(x ,y)
        end
    end
    
    def solution(x ,y)
      return getMoveCountO1(x, y)
    end
    
    
    puts solution(0,0)
    

    Only intention is to save someone some time converting code if anyone needs full code.

提交回复
热议问题