Knight's Shortest Path on Chessboard

后端 未结 16 1320
情深已故
情深已故 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:18

    Very interesting problem which I was encountered recently. After looking some solutions I was tried to recover analytic formula (O(1) time and space complexity) given on SACO 2007 Day 1 solutions.

    First of all I want to appreciate Graeme Pyle for very nice visualization which helped me to fix formula.

    For some reason (maybe for simplification or beauty or just a mistake) they moved minus sign into floor operator, as a result they have got wrong formula floor(-a) != -floor(a) for any a.

    Here is the correct analytic formula:

    var delta = x-y;
    if (y > delta) {
        return delta - 2*Math.floor((delta-y)/3);
    } else {
        return delta - 2*Math.floor((delta-y)/4);
    }
    

    The formula works for all (x,y) pairs (after applying axes and diagonal symmetry) except (1,0) and (2,2) corner cases, which are not satisfy to pattern and hardcoded in the following snippet:

    function distance(x,y){
         // axes symmetry 
         x = Math.abs(x);
         y = Math.abs(y);
         // diagonal symmetry 
         if (x < y) {
            t = x;x = y; y = t;
         }
         // 2 corner cases
         if(x==1 && y == 0){
            return 3;
         }
         if(x==2 && y == 2){
            return 4;
         }
        
        // main formula
        var delta = x-y;
    		if(y>delta){
      		return delta - 2*Math.floor((delta-y)/3);
      	}
      	else{
      		return delta - 2*Math.floor((delta-y)/4);
      	}
    }
    
    
    $body = $("body");
    var html = "";
    for (var y = 20; y >= 0; y--){
    	html += '';
    	for (var x = 0; x <= 20; x++){
      	html += ''+distance(x,y)+'';
      }
      html += '';
    }
    
    html = ''+html+'
    '; $body.append(html);

    Note: The jQuery used for only illustration, for code see distance function.

提交回复
热议问题