2011-11-29 27 views
0

我有这样一个矩阵4x4矩阵的组合所有5个字符

var matrix = new char[][] 
{ 
    new char[] { '0', '1', '2', '3' }, 
    new char[] { '7', '6', '5', '4' }, 
    new char[] { '8', '9', 'A', 'B' }, 
    new char[] { 'F', 'E', 'D', 'C' } 
}; 

我需要得到这个矩阵的所有可能的组合,每5个字符,但每个char必须是下一个直接邻居,例如,0,5和4,8是无效的,但是0,6和3,4是有效的。

该矩阵不会像样本中那样是静态的,它每次都会以任意位置的十六进制数字生成。

谢谢!

+0

你绑定了什么?或者你在寻找能为你工作的人? – Reniuz

+0

不,我正在寻求帮助,这是我认为这个网站的目的?我所做的atm是生成所有可能的十六进制数组合,然后检查它在数组中是否有效,但是它太慢而且不适合生产 – Bruno

+1

是这个作业吗?你是什​​么意思“每个5字符”? – DarkSquirrel42

回答

1

只是为了好玩 - Delphi代码。 'shl'左移(< <),字符串是基于一个的。在矩阵周围添加边界作为标记以简化检查。

一些额外的评论:我使用6x6矩阵 - 4x4核心与数字,和一个单元格宽度的外边框。 Int64的36位用作标记。 1的位值表示边界或被访问的单元。过程StartTravel从核心的某个起始单元启动路径查找。路径搜索类似于DFS(深度优先搜索),但在路径长度变为5时中断。

const 
    Directions: array[0..3] of Integer = (-1, -6, 1, 6); 

var 
    Digits: string; 
    Mask: Int64; 
    i, j: Integer; 

    procedure Travel(AFrom: Integer; Visited: Int64; Path: string); 
    var 
    i, Dir: Integer; 
    NewMask: Int64; 
    begin 
    if Length(Path) = 5 then 
     PrintOut(Path) 
    else 
     for i := 0 to 3 do begin 
     Dir := Directions[i]; 
     NewMask := 1 shl (AFrom + Dir); 
     if (Visited and NewMask) = 0 then 
      Travel(AFrom + Dir, Visited or NewMask, Path + Digits[AFrom + Dir + 1]); 
     end; 
    end; 

    procedure Init; 
    var 
    i: Integer; 
    begin 
    Digits := '-------0123--7654--89AB--FEDC-------'; 
    Mask := 0; 
    for i := 1 to Length(Digits) do 
     if Digits[i] = '-' then 
     Mask := Mask or (1 shl (i - 1)); 
    end; 

    procedure StartTravel(Row, Col: Integer); 
    var 
    APos: Integer; 
    begin 
    APos := Row * 6 + Col + 7; 
    Travel(APos, Mask or (1 shl APos), Digits[APos + 1]); 
    end; 

begin 
    Init; 
    for i := 0 to 3 do 
    for j := 0 to 3 do 
     StartTravel(i, j); 

432 combinations: 

01256 
01254 
0125A 
01678 
01652 
01654 
0165A 
01698 
0169A 
0169E 
07612 
07652 
.... 
CBADE 
CB456 
CB452 
CB45A 
CB432 
+0

谢谢你!我将它转换为C#。 – Bruno

+0

我转换了它,它工作的很棒!虽然我不确定这个算法是如何工作的,但是谢谢! – Bruno

+0

添加了一些意见。你是否熟悉位算法? – MBo

1

All possible combinations of an array

Generating all Possible Combinations

这些可以帮助你。顺便请相信“搜索”

+1

我做了搜索,发现那些2帖子和更多,但他们不回答我的问题,你读过吗? – Bruno

+0

你不希望人们为你编写所有的代码。这些答案应该给你提示写你自己的代码。顺便说一下,你没有问你一个问题,你只需输入你的作业或水手。那里的问题在哪里?你卡在哪里? –