// 휴리스틱을 구합니다. // h_scr 은 타일이 불 일치하는 값이고, // g_scr 은 노드의 깊이를 의미합니다. // f_scr 은 h_scr + g_scr 을 더한 값이며, 이를 기준으로 우선탐색을 진행하게 됩니다. protected void f(Puzzle3x3 puzzle3x3) { for (int i = 0; i < 9; ++i) { if (puzzleState[i] != puzzle3x3.final_state[i]) { ++h_scr; } } if (parent != null) { g_scr = parent.g_scr + 1; } f_scr = g_scr + h_scr; }
public Node(Puzzle3x3 puzzle3x3, int _move, int[] _puzzleState, Node _parent) { // 부모를 세팅하고 puzzleState를 복사합니다. parent = _parent; puzzleState = (int[])_puzzleState.Clone(); // 공백을 찾고 +move 만큼 움직이고, 해당 값과 교체합니다. int blankIDX = Array.FindIndex(puzzleState, x => x == 0); puzzleState[blankIDX] = puzzleState[blankIDX + _move]; puzzleState[blankIDX + _move] = 0; // 휴리스틱 계산 f(puzzle3x3); }