2016-12-09 1 views
2

누적 된 큐브의 배열을 정렬하려고합니다. 배열은 다음과 같을 것이다 이 배열을 올바르게 정렬하려면 어떻게합니까?

Nth Cube | Position (0, its on the desk, >0, its on another cube) 
--- 
1|6 
--- 
2|8 
--- 
3|0 
--- 
4|0 
--- 
5|0 
--- 
6|0 
--- 
7|1 
--- 
8|4 
--- 

내가 다른 일에있는 큐브 정리
[7] [2] 
--- 
[1] [8] 
--- 
[6] [4] [3] [5] 
--- 

을 시각화이 (예를 들어)과 같습니다

문자열 [,] 이 경우 t는 전체 배열입니다.

static string[,] stackedCubes(string[,] t) 
    { 
     string[,] stackedHelp = new string[NumberOfStacked(),2]; 
     int j = 0; 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if (t[i, 1]!="0") 
      { 

       stackedHelp[j, 0] = t[i, 0]; 
       stackedHelp[j, 1] = t[i, 1]; 
       j++; 
      } 
     } 
     return stackedHelp; 
    } 
로 나오는 691,363,210

:

1|6 
--- 
2|8 
--- 
7|1 
--- 
8|4 
--- 

지금 여기부터 (당시 너무 7/2 1/8) 정상에서

문자열 [,] t 그들을 내려 놓으려고 메신저 stackedCubes입니다 여기

static string[,] Putdown(string[,] t) 
    { 
     string[,] stackedOrder = new string[NumberOfStacked(), 2]; 
     int j = 0; 
     do 
     { 
      for (int i = 0; i < t.GetLength(0); i++) 
      { 
       if (t[i, 1] == t[j, 0]) 
       { 
        j = i; 
       } 
       else if(IsSomethingOnTheCube(t[j,0],t)==false) 
       { 
        stackedOrder[i, 0] = t[j, 0]; 
        stackedOrder[i, 1] = "0"; 
        t[i, 1] = "0"; 
       } 
      } 
     } 
     while (AreAllTheCubesOnTable(t) != true); 

     return stackedOrder; 
    } 

그것에 것이 있으면 제 큐브가는 IM 1 (t 된 [j에 0]) 및 확인이 t에 발견은 [I 1] 및 7 (t의 [백 준다 j, 0]) 그리고 되돌아 간다. 나는 또한 확인 여기

static bool IsSomethingOnTheCube(string Cube,string[,] t) 
    { 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if(Cube==t[i,1]) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

큐브에 뭔가합니다 (DO-동안 함께) 책상에

static bool AreAllTheCubesOnTable(string[,] t) 
    { 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if (t[i, 1] != "0") 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

모두를 수 있는지 여부가 있는지 확인하고 출력은 모든 잘못 :

7|0 
--- 
7|0 
--- 
7|0 
--- 
7|0 
--- 

이 같은해야 할 때 :

7|0 
--- 
1|0 
--- 
2|0 
--- 
8|0 
--- 
,691을 내가 잘못 색인하고 363,210

는? (또는 뭔가 다른) 샘플에서

+0

예상되는 결과는 무엇입니까 (7 | 0, 1 | 0, 2 | 0, 8 | 0)은? – EpicSam

+0

Putdown()의 반환 값 - 문자열 [,] stackedOrder - 다 완료되었을 때 – throwjdoe

+1

질문에 도메인 언어를 사용하는 것이 혼란 스럽습니다. "책상 위에"있거나 "다른 큐브 위에"있는 "큐브"는 뇌 외부의 사람들이나 알고있는 사람들에게는 절대적으로 아무 의미가 없습니다. 일반 코드로 말하십시오. – eurotrash

답변

0

이 문제의 결론은 임의처럼 보이는

string[] cubes = new string[] 
    {"1|6", "2|8", "3|0", "4|0", "5|0", "6|0", "7|1", "8|4"}; 

를 제공했다. (사전 식으로 말하자면)의이 가장 낮은 큐브를 주문하자 그래서 시각화은 다음과 같습니다

lines: 
    2:  [2]  [7] 
    1:  [8]  [1] 
    0: [3] [4] [5] [6] <- bottom line is sorted 
------------------------ 
files: 0 1 2 3 

이 작업을 완료하는 데, 우리는 두 도움이 방법 구현할 수 있습니다

// Line: 0 for lowest cubes 
    private static int CubeLine(string value, IEnumerable<String> stack) { 
     for (int line = 0; ; ++line) { 
     string parent = value.Substring(value.IndexOf('|') + 1); 

     if ("0".Equals(parent)) 
      return line; 

     value = stack.First(item => item.StartsWith(parent + "|")); 
     } 
    } 

그리고

// File: 0 for leftmost cubes 
    private static int CubeFile(string value, IEnumerable<String> stack) { 
     string root = value; 

     while (true) { 
     string parent = root.Substring(root.IndexOf('|') + 1); 

     if ("0".Equals(parent)) 
      break; 

     root = stack.First(item => item.StartsWith(parent + "|")); 
     } 

     return stack 
     .Where(item => item.Substring(value.IndexOf('|') + 1) == "0") 
     .OrderBy(item => item) 
     .Select((item, index) => new { 
      item = item, 
      index = index 
     }) 
     .First(item => item.item == root) 
     .index; 
    } 

그리고 나서 원하는대로 쉽게 정렬 할 수 있습니다.결과 편집

2, 7, 8, 1, 3, 4, 5, 6 

string[] cubes = new string[] {"1|6", "2|8", "3|0", "4|0", "5|0", "6|0", "7|1", "8|4"}; var result = cubes .Select (cube => new { name = cube.Substring(0, cube.IndexOf('|')), file = CubeFile(cube, cubes), line = CubeLine(cube, cubes) }) .OrderByDescending(cube => cube.line) .ThenBy(cube => cube.file) .Select(cube => cube.name); Console.Write(string.Join(", ", result)); 

입니다

: 당신이 아래로 바로 첫째, 상단 왼쪽 정렬하려는 경우 예를 들어, 첫 번째 넥타이 맨 왼쪽의 경우, 첫 맨 위 큐브를 정렬 할 수 있습니다 넥타이 :

var result = cubes 
    .Select (cube => new { 
     name = cube.Substring(0, cube.IndexOf('|')), 
     file = CubeFile(cube, cubes), 
     line = CubeLine(cube, cubes) }) 
    .OrderBy(cube => cube.file) 
    .ThenByDescending(cube => cube.line) 
    .Select(cube => cube.name); 

그리고 결과는

,536입니다 91,363,210
3, 2, 8, 4, 5, 7, 1, 6 

편집 2 : 주문 내려 놔 : 바닥 우선 관계가 임의

var result = cubes 
    .Select (cube => new { 
     name = cube.Substring(0, cube.IndexOf('|')), 
     file = CubeFile(cube, cubes), 
     line = CubeLine(cube, cubes) }) 
    .OrderBy(cube => cube.line) 
    .Select(cube => cube.name); 

결과 :

배열을 이용하여 프로그래밍을 시작할 때 다차원 배열은 다양한 실시 예에서 사용되지만
3, 4, 5, 6, 1, 8, 2, 7 
+0

질문에서 예상되는 결과는 시각화에 수직 정렬을 의미하는 순서 7 -> 1을 제공합니다. 귀하의 대답은 수평 순서를 부여합니다. – EpicSam

+0

@EpicSam :'CubeFile'과'CubeLine'을 가지고 있으면 필요에 따라 쉽게 배열을 분류 할 수 있습니다. 내 편집을 참조하십시오. –

+0

오, 소년 어디서부터 시작합니까, 처음에는 질문을 anwsering 시간을내어 주셔서 감사합니다, 그러나 나는 단지 프로그래밍을 배우기 시작한 이래로 나는 정말로 당신이 거기에 놓은 코드를 만들지 않고, 내 succesfuly로 번역합니다. 그것을 출력 system.linq ...) 빌드 할 수도, 난 정말 정말 정렬 된 배열 stackedCubes() 도움이 필요할 때 예상 된 결과에 표시된 것처럼 위로 (에서) Putdown하려고합니다 – throwjdoe

0

강하게 타자를 치는 종류의 일반적으로 적당하다. 즉, 다차원 배열이 사전과 같은 다른 형식으로 계속 파싱 될 수있는 경우입니다. 예를 들어 상기

가 완료
string[,] cubes = {{"1","6"} ,{ "2","8"} ,{ "3","0"} ,{ "4","0"} ,{ "5","0"} ,{ "6","0"} ,{ "7","1"} ,{ "8","4"}}; 


//create a dictionary of all cube-parents 
var parents = (from i in Enumerable.Range(0, cubes.GetLength(0))      
       group cubes[i,0] by cubes[i,1]) 
       .ToDictionary(g=>g.Key, g=>g.ToArray());  

var layer = parents["0"]; //table level cubes [3,4,5,6] 
var layers= new List<string[]>(); 
while(layer != null){ 
    layers.Add(layer); 
    string[] children, nextlayer = null; 
    for(int i = 0; i < layer.Length; i++) 
     if(layer[i] != null && parents.TryGetValue(layer[i], out children)){ 
      if(nextlayer==null)nextlayer= new string[layer.Length]; 
      nextlayer[i] = children[0]; //what to do with multiple children? 
     } 
    layer= nextlayer; 
}; 

layers 환언 여러 층 {[3,4,5,6],[null,8,null,1], [null,2,null,7]}를 포함한다. 원하는 최종 결과가 어느 것인지 확실하지 않습니다. 테이블에없는 모든 큐브와 같은 시각적 표현입니까 (후자는 단순히 부모 '0'을 갖지 않는 모든 항목입니다)

관련 문제