2016-07-11 131 views
-1

所有可能的唯一路径帮我寻找一切可能的路径,从顶部到达底部最右边的单元最左边的单元格。查找m×n矩阵

下面是限制,

  1. 不能访问它已经访问过的细胞。
  2. ,应当在到达出口处即右下角大多数细胞前访问所有细胞。

试过几个逻辑的,但没能获得所有路径。由于

回答

0

最简单的想法是递归想尽一切可能的非自交路,每一次这样的路径命中右下角检查它是否是长度等于所有细胞的数量。

这里是一个非常天真[因此缓慢和内存消耗]在js中的实现(根据您的配置文件判断,您知道js),只是以正式,明确的方式指出算法。你对“好吧,让我们这样做吧!”感兴趣部分之前,仅仅是一些助手,以使这个例子实际上是可执行文件:

function paths(M,N) { 
    // is given pos present in list of poss?                                                          
    var pos_member = function(pos,poss) { 
     for(var i=0;i<poss.length;i++) 
      if(pos[0]==poss[i][0] && pos[1]==poss[i][1]) 
       return true; 
     return false; 
    }; 
    // all positions present in poss1 and not in poss2:                                                       
    var positions_diff = function(poss1,poss2) { 
     var poss_d = []; 
     for(var i=0;i<poss1.length;i++) 
      if(pos_member(poss1[i],poss2)==false) 
       poss_d.unshift(poss1[i]); 
     return poss_d; 
    }; 
    // where can you go from [x,y] ?                                                            
    var all_next_positions = function([x,y]) { 
     var poss = []; 
     // assuming no diagonal moves are allowed;                                                        
     // otherwise add 4 more next possible positions.                                                       
     if(x > 0) poss.unshift([x-1,y]); 
     if(x < M-1) poss.unshift([x+1,y]); 
     if(y > 0) poss.unshift([x,y-1]); 
     if(y < N-1) poss.unshift([x,y+1]); 
     return poss; 
    }; 

    //////// OK, let's do this! //////////////////////////////////                                                    
    var pending = [ [[0,0]] ]; // pending partial paths (looks like an owl statring at you, doesn't it?)                                           
    var results = []; // corect paths found so far                                                        

    while(pending.length>0) { 
     var current = pending.shift(); 
     var last_pos = current[0]; 
     if(last_pos[0]==M-1 && last_pos[1]==N-1) { 
      /// it reaached the goal, but did it visit all the cells?                                                   
      if(current.length == M*N) /// yes it did, so keep it.                                                    
       results.unshift(current); 
     } else { 
      /// keep going...                                                             
      var next_poss = positions_diff(all_next_positions(last_pos), current); 
      for(var i=0;i<next_poss.length;i++) { 
       var candidate = current.slice(0); /// clone, because call by reference is evil.                                             
       candidate.unshift(next_poss[i]); 
       pending.unshift(candidate); 
      } 
     } 
    } 
    return results; 
} 

对于确定要以不同的方式表示位置,并为更大的“矩阵”你必须摆脱“错路”尽快。 ,但希望这可以让你开始某个地方。