1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB 보덴 : 안녕하세요. 3 00:00:13,715 --> 00:00:17,800 롭 해요, 나는 당신의 희망 15 게임을위한 게임. 4 00:00:17,800 --> 00:00:22,040 이제, 당신이 필요로하는 네 가지 기능이 있습니다 이 프로그램에 구현하는 - 초기화하는 것은, 5 00:00:22,040 --> 00:00:24,650 그릴 이동 이겼다. 6 00:00:24,650 --> 00:00:27,230 그래서, 초기화를 살펴 보자. 7 00:00:27,230 --> 00:00:32,930 >> 여기에서, 우리는 우리가하고있는 제일 먼저 참조 하기 위하여려고하는 변수를 선언합니다 8 00:00:32,930 --> 00:00:34,600 카운터했다. 9 00:00:34,600 --> 00:00:37,620 이 초기화 될 것 D 번 D 마이너스 1. 10 00:00:37,620 --> 00:00:40,200 d는 차원이라는 것을 기억 우리의 보드. 11 00:00:40,200 --> 00:00:43,840 어떻게 초기화 작업하려고하는 것은 무슨이다 전체 보드를 반복합니다 12 00:00:43,840 --> 00:00:46,050 우리는 시작하는거야 왼쪽 상단. 13 00:00:46,050 --> 00:00:48,570 >> 그리고 그냥 가정 해 봅시다 우리 4 × 4 보드가있다. 14 00:00:48,570 --> 00:00:51,220 그래서 최고는 우리가있어 남아 말을하려고하면 15입니다. 15 00:00:51,220 --> 00:00:53,960 그리고 우리는 단지 계산거야 보드를 통해, 15, 14, 13 말 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, 등등. 17 00:00:58,510 --> 00:01:03,780 그래서 왼쪽, 우리는 D 배 예상 D 마이너스 1, 4로 4하는 18 00:01:03,780 --> 00:01:08,290 경우는 16 마이너스가 될 것입니다 1, 정확하게 15입니다. 19 00:01:08,290 --> 00:01:10,885 >> 우리가가는 곳 그리고 지금 여기 전체 보드를 통해 반복. 20 00:01:10,885 --> 00:01:14,720 그리고 우리는 각각의 위치를​​ 설정하는거야 의 전류치 보드 21 00:01:14,720 --> 00:01:19,090 우리의 카운터 다음 카운터는 것입니다 감소하는, 그래야 다음 22 00:01:19,090 --> 00:01:22,300 우리가 도달 위치는해야 할 것입니다 카운터 이상이어야 23 00:01:22,300 --> 00:01:23,690 이전 위치. 24 00:01:23,690 --> 00:01:26,970 그래서 우리는 처음에 15을했고 카운터를 감소시킵니다. 25 00:01:26,970 --> 00:01:30,065 그래서 우리는 14을 할당하는거야 다음 위치, 감소 카운터, 26 00:01:30,065 --> 00:01:33,710 우리는 할당에가는거야 13, 등등. 27 00:01:33,710 --> 00:01:37,620 >> 마지막으로, 우리는 그 코너를 처리 할 필요가 경우 경우, 보드가 더있는 경우 28 00:01:37,620 --> 00:01:44,450 치수는 다음 단지, 15, 14, 13 일 (12)는 모든 방법 아래로 3, 2, 1이고, 29 00:01:44,450 --> 00:01:46,780 우리를 떠나려고 해결 못하는 보드. 30 00:01:46,780 --> 00:01:49,390 그리고 우리는 1과 2를 교체해야합니다. 31 00:01:49,390 --> 00:01:52,930 D의 모드 2 0에 해당한다면, 그건 우리는 확인하는 것입니다 방법 32 00:01:52,930 --> 00:01:54,410 그것도의 경우에 볼 수 있습니다. 33 00:01:54,410 --> 00:01:59,810 D의 모드 2는 0, 다음 행 D 마이너스에 동일한 경우 1, 어떤 아래 행이며, 34 00:01:59,810 --> 00:02:05,430 위치 D 마이너스 2, 또는 열 D 마이너스 2, 우리는 2 부분을 설정하려고하고있어 35 00:02:05,430 --> 00:02:07,860 D 열 마이너스 3 우리가있어 1로 설정하는 것. 36 00:02:07,860 --> 00:02:12,170 그래서 그냥 반전 어디에 도 1 및 2는 현재. 37 00:02:12,170 --> 00:02:16,270 >> 마지막으로, 우리는 매우를 설정하는거야 오른쪽 아래 빈 같 곳 38 00:02:16,270 --> 00:02:20,700 빈 해시가 정의되어 있습니다 0으로 상단에. 39 00:02:20,700 --> 00:02:26,785 그래서, 즉, 꼭 필요하지 않았다 루프이해야 할 것입니다 때문에 40 00:02:26,785 --> 00:02:30,610 0으로 오른쪽 아래, 이후 설정 카운터는 자연적으로 0에 도달 할 것입니다. 41 00:02:30,610 --> 00:02:34,610 하지만 알고 우리에 의존하는 빈은 0을 찾기 위해 해시했다. 42 00:02:34,610 --> 00:02:38,280 나중에이 프로그램으로 이동 한 경우 100에 상단에 공백을 변경 그것을 43 00:02:38,280 --> 00:02:39,770 여전히 작동합니다. 44 00:02:39,770 --> 00:02:43,180 >> 그래서 이것은 단지 있는지 확인하고있다 오른쪽 아래는 실제로 동일하다 우리의 45 00:02:43,180 --> 00:02:44,870 빈 값. 46 00:02:44,870 --> 00:02:50,270 마지막으로, 우리는 두 개의 전역 변수를 가지고, 그래서 빈 J 빈, 우리는 참조 47 00:02:50,270 --> 00:02:53,360 사람들은 상단에 선언했다. 48 00:02:53,360 --> 00:02:56,270 그리고 우리는 그 두 개의 전역을 사용하는 것입니다 추적 할 변수 49 00:02:56,270 --> 00:02:59,040 빈의 위치, 우리가하지 않도록 전체를 볼 필요가 50 00:02:59,040 --> 00:03:03,890 빈은 매일 찾을 수있는 보드 우리는 움직임을 만들려고 시간. 51 00:03:03,890 --> 00:03:08,450 따라서 블랭크의 위치는 항상 오른쪽 아래에 시작하는 것. 52 00:03:08,450 --> 00:03:13,270 그래서 오른쪽 아래가 주어진다 인덱스 D - 1, D - 1. 53 00:03:13,270 --> 00:03:14,880 그래서, 그 초기화합니다. 54 00:03:14,880 --> 00:03:17,040 >> 이제 우리는 그리로 이동합니다. 55 00:03:17,040 --> 00:03:19,370 그래서, 무승부는 유사 할 것입니다 우리는 반복하는가는 곳 56 00:03:19,370 --> 00:03:20,970 전체 보드 위에. 57 00:03:20,970 --> 00:03:25,400 그리고 우리는 단지 값을 인쇄 할 그 보드의 각 위치에 있습니다. 58 00:03:25,400 --> 00:03:29,580 그래서 여기, 우리의 가치를 인쇄하는 보드의 각 위치에있다. 59 00:03:29,580 --> 00:03:32,280 그리고 우리가하고있는 것을 알 수 -. 60 00:03:32,280 --> 00:03:37,410 그리고 그것은 단지의 printf를 말하고 그 에 관계없이 한 자리 또는의 경우의 61 00:03:37,410 --> 00:03:42,010 두 자리 숫자로, 우리는 여전히 그것을 원하는 프린트 아웃 두 개의 열을 차지 62 00:03:42,010 --> 00:03:46,290 그 때문에 우리는 두 개의 숫자와 하나가있는 경우 동일한 보드의 자리 숫자, 우리의 63 00:03:46,290 --> 00:03:49,450 보드는 여전히 좋은 사각 볼 것이다. 64 00:03:49,450 --> 00:03:54,190 >> 그래서 우리는 모든 값을 위해 그렇게 할 보드, 빈을 제외하고. 65 00:03:54,190 --> 00:03:58,260 따라서, 경우 보드의 위치는 동일 빈, 우리 특별히 66 00:03:58,260 --> 00:04:01,730 그냥 밑줄을 인쇄 할 빈을 나타내는 대신합니다 67 00:04:01,730 --> 00:04:05,150 의 어떤 값 빈 사실이다. 68 00:04:05,150 --> 00:04:08,500 >> 마지막으로, 우리는 인쇄 할 새로운 라인 아웃. 69 00:04:08,500 --> 00:04:11,970 이 안에 여전히 있음을 알 외부 루프에 대한 외부하지만, 70 00:04:11,970 --> 00:04:13,200 루프 내부. 71 00:04:13,200 --> 00:04:17,930 루프이 외부가 반복되기 때문에 모든 행에 대해, 그래서이 printf와는 72 00:04:17,930 --> 00:04:22,130 단지 새로운 라인을 인쇄, 그래서가는 우리 다음 행을 인쇄로 이동합니다. 73 00:04:22,130 --> 00:04:23,910 그리고 그 끌기 위해의. 74 00:04:23,910 --> 00:04:27,770 >> 그래서, 지금의이 이동하는 이동하자. 75 00:04:27,770 --> 00:04:32,590 이제, 우리는, 타일을 이동에 합격 사용자는 게임에 입력 - 그들이 76 00:04:32,590 --> 00:04:36,360 그들이 이동할 타일을 입력합니다 - 및 당신은 부울을 반환하는데, 그렇게하고 77 00:04:36,360 --> 00:04:39,300 참 또는 거짓에 따라 하나 그 움직임은 사실 여부 78 00:04:39,300 --> 00:04:43,360 유효 - 타일이 될 수 있는지 여부 빈 공간으로 이동했다. 79 00:04:43,360 --> 00:04:48,340 >> 그래서 여기, 우리는 지역 변수를 선언, tile_1과에 가고있다 tile_j, 80 00:04:48,340 --> 00:04:52,150 blank_i 및 blank_j 비슷할, 그것은 추적 것 제외 81 00:04:52,150 --> 00:04:54,910 타일​​의 위치. 82 00:04:54,910 --> 00:05:00,370 지금 여기, 우리는 blank_i 사용하는거야 그리고 blank_j 등 모든 권리를 말한다 83 00:05:00,370 --> 00:05:01,930 여기 보드의 빈이다. 84 00:05:01,930 --> 00:05:04,420 >> 이제 빈 위의 타일은? 85 00:05:04,420 --> 00:05:06,210 빈의 왼쪽에있는 타일인가? 86 00:05:06,210 --> 00:05:07,420 블랭크의 오른쪽 타일인가? 87 00:05:07,420 --> 00:05:08,970 빈 아래의 타일인가? 88 00:05:08,970 --> 00:05:13,330 그래서, 타일은 그 중 하나에있는 경우 위치는, 우리가 알고있는 타일 89 00:05:13,330 --> 00:05:16,390 빈 자리로 이동 할 수 있습니다 빈은 이동 될 수 있습니다 90 00:05:16,390 --> 00:05:18,240 타일​​은 현재. 91 00:05:18,240 --> 00:05:26,400 >> 그래서 여기, 우리가 말을하면 위치 보드 blank_i - 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 그래서이 말하고있는이 타일입니다 현재 빈 위? 93 00:05:31,120 --> 00:05:34,350 그리고, 우리가 기억하는거야 즉, 타일의 위치입니다. 94 00:05:34,350 --> 00:05:37,870 타일​​ 위치 blank_i에 마이너스 1 blank_j. 95 00:05:37,870 --> 00:05:40,660 이제 첫 번째, 우리는 또한이 검사를 바로 여기에, 그래서 blank_i입니다 96 00:05:40,660 --> 00:05:41,760 0보다 크다. 97 00:05:41,760 --> 00:05:43,410 >> 왜 우리는 그렇게 할 수 있습니까? 98 00:05:43,410 --> 00:05:47,290 음, 빈은 맨 위의 행에있는 경우 보드의, 우리는하고 싶지 않아 99 00:05:47,290 --> 00:05:51,240 이후 타일의 빈 위에보고 맨 위의 것은 없다 100 00:05:51,240 --> 00:05:52,430 보드의 행. 101 00:05:52,430 --> 00:05:55,950 이것은 당신이 그만 둘 수있는 방법입니다 세그먼트 오류 또는 같은 102 00:05:55,950 --> 00:05:59,030 프로그램은 작동하지 않을 수 있습니다 예상치 못한 방법으로. 103 00:05:59,030 --> 00:06:04,310 그래서, 이것은 우리가하지 않는 것을 확인하고있다 유효하지 않은 곳에서 찾는다. 104 00:06:04,310 --> 00:06:08,470 >> 지금 우리를 위해 같은 일을 할거야 다른 모든 가능한 조합. 105 00:06:08,470 --> 00:06:13,250 그래서 여기, 우리는 빈 아래 찾고 그 타일의 경우에 볼 수 있습니다. 106 00:06:13,250 --> 00:06:16,950 그리고 우리는 확실히 우리가있어 확인해야 하지 맨 아래 행에, 그렇지 않으면 우리 107 00:06:16,950 --> 00:06:18,910 타일​​을 찾을 수 없습니다. 108 00:06:18,910 --> 00:06:25,040 여기에서, 우리는 왼쪽에 보는거야 이 타일의 경우 빈 확인합니다. 109 00:06:25,040 --> 00:06:27,860 그리고 우리는 왼쪽으로 보면 안 되죠 우리는 왼쪽 열에 있다면. 110 00:06:27,860 --> 00:06:30,100 그리고 여기에 우리는에 보는거야 오른쪽 빈의, 우리는하지 말아야 111 00:06:30,100 --> 00:06:33,340 우리가 있다면 오른쪽에 보면 맨 오른쪽 열에서. 112 00:06:33,340 --> 00:06:37,820 >> 그래서, 그런 것들 중 어느 것도 사실이 없을 경우, 그 타일이 인접하지 않았다 의미 113 00:06:37,820 --> 00:06:39,640 빈과에 우리는 false를 반환 할 수 있습니다. 114 00:06:39,640 --> 00:06:41,230 움직임은 유효하지 않습니다. 115 00:06:41,230 --> 00:06:47,010 하지만, 그 중 하나가 사실이라면, 다음에 이 점은, 우리는 tile_i을 알고 116 00:06:47,010 --> 00:06:50,540 tile_j은 동일하다 타일​​의 위치. 117 00:06:50,540 --> 00:06:55,210 그래서, 우리는에서 보드를 업데이트 할 수 있습니다 포지션 tile_i 및 tile_j. 118 00:06:55,210 --> 00:06:59,820 우리는 새 값이 비어있게됩니다 알고 그 위치 blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, 원래 있던 빈 - 우리는 타일 것입니다 알고 120 00:07:02,950 --> 00:07:04,030 이 이동합니다. 121 00:07:04,030 --> 00:07:07,610 >> 우리가 실제로 할 필요가 없습니다주의 여기에 실제 스왑, 우리가 알고 있기 때문에 122 00:07:07,610 --> 00:07:09,850 삽입해야 할 값 그 위치에. 123 00:07:09,850 --> 00:07:13,780 우리는 임시을 필요로하지 않는다 주변 변수입니다. 124 00:07:13,780 --> 00:07:16,920 >> 마지막으로, 우리는 우리를 기억해야합니다 우리의 글로벌 변수가 125 00:07:16,920 --> 00:07:18,980 위치 추적 유지 빈. 126 00:07:18,980 --> 00:07:22,780 그래서 우리의 위치를​​ 업데이트 할 여기서 타일 될 수있는 빈 127 00:07:22,780 --> 00:07:24,190 원래이었다. 128 00:07:24,190 --> 00:07:27,680 마지막으로, 우리는 (때문에), true를 반환 이동 성공했습니다. 129 00:07:27,680 --> 00:07:31,110 우리는 성공적으로 교체 타일​​ 빈. 130 00:07:31,110 --> 00:07:34,890 >> 좋아요, 마지막으로 우리 원을 확인해야합니다. 131 00:07:34,890 --> 00:07:39,900 그래서, 원 마찬가지로 부울을 반환 곳 true를 표시하는 것입니다 그 132 00:07:39,900 --> 00:07:41,460 사용자는 게임을 수상했다. 133 00:07:41,460 --> 00:07:43,780 false를 나타내는된다 게임은 여전히​​ 것입니다. 134 00:07:43,780 --> 00:07:46,340 사용자가 원 않았습니다. 135 00:07:46,340 --> 00:07:52,100 그래서,이 꽤 많이 될 것입니다 INIT의 반대, 위치 초기화, 136 00:07:52,100 --> 00:07:56,920 우리는 보드를 초기화 기억 그래서 15, 14, 13, 12,. 137 00:07:56,920 --> 00:08:03,000 수상 반면, 우리는 당신을 검사 할 경우 보드는 1, 2, 3, 4, 5, 및이다. 138 00:08:03,000 --> 00:08:06,600 >> 그래서, 우리는 초기화거야 우리 그 어떤 정상이기 때문에 1로 대응 139 00:08:06,600 --> 00:08:08,400 보드의 왼쪽이 있어야합니다. 140 00:08:08,400 --> 00:08:10,860 그리고, 우리는 루프에가는거야 전체 보드 위에. 141 00:08:10,860 --> 00:08:13,690 의이 조건을 무시하자 초. 142 00:08:13,690 --> 00:08:18,410 그리고이 조건은 예정 검사는이 위치에서 보드 143 00:08:18,410 --> 00:08:20,790 현재 카운트에 해당? 144 00:08:20,790 --> 00:08:27,040 그렇다면, 카운트를 증가되도록 우리가 볼 다음 위치는 하나의 높은 145 00:08:27,040 --> 00:08:29,690 우리는 현재에있다 위치보다. 146 00:08:29,690 --> 00:08:32,700 >> 그래서 우리가 얻는 방법 왼쪽은 1이어야한다. 147 00:08:32,700 --> 00:08:33,950 2 카운트를 증가. 148 00:08:33,950 --> 00:08:35,010 다음 위치에서 봐. 149 00:08:35,010 --> 00:08:35,690 이 2? 150 00:08:35,690 --> 00:08:37,659 그렇다면, 3 카운트를 증가. 151 00:08:37,659 --> 00:08:39,179 다음 위치는 3인가? 152 00:08:39,179 --> 00:08:42,440 그렇다면, 카운트를 증분 4 등. 153 00:08:42,440 --> 00:08:49,190 그래서,에 대한 위치가있는 경우 우리의 수를 동일하지 않습니다 보드, 154 00:08:49,190 --> 00:08:52,640 우리는 그 이후 false를 반환 할 일부 타일이 있다는 뜻 155 00:08:52,640 --> 00:08:55,490 하지 올바른 위치에있다. 156 00:08:55,490 --> 00:08:58,810 >> 그래서 여기,이 조건은 무엇을하고 있습니까? 157 00:08:58,810 --> 00:09:02,170 음, 공백이 있음을 유의 오른쪽 하단에 가기로되어. 158 00:09:02,170 --> 00:09:06,180 그리고 빈의 값이 그렇지 않을 수 있습니다 반드시 값을 같게 159 00:09:06,180 --> 00:09:11,080 그 도달 할 것입니다 카운터 오른쪽 아래에. 160 00:09:11,080 --> 00:09:15,760 그래서 우리는 구체적으로 확인 싶다면 동일은 D - 1과 J 같음 같음 161 00:09:15,760 --> 00:09:19,470 D - 1에 해당 - 말하는 경우 우리 오른쪽 하단의에서 찾고 있습니다 162 00:09:19,470 --> 00:09:22,050 보드 - 우리 단지 계속하려면. 163 00:09:22,050 --> 00:09:26,200 우리는이 특정를 건너 뛰 For 루프의 반복. 164 00:09:26,200 --> 00:09:31,250 >> 그래서, 우리는이를 통해 얻을 관리하는 경우 루프 중첩, 그 의미 165 00:09:31,250 --> 00:09:34,690 에 있던 어떤 타일은 없었다 잘못된 위치. 166 00:09:34,690 --> 00:09:38,900 그리고 우리는 루프의 탈옥과 올 여기에, 우리는 어디에서 true를 반환 할 수 있습니다. 167 00:09:38,900 --> 00:09:41,800 모든 타일이 올바른 위치에 있었다 그것은 사용자가 가지고있는 의미 168 00:09:41,800 --> 00:09:43,230 게임을 이겼다. 169 00:09:43,230 --> 00:09:44,460 그리고 바로 그거야. 170 00:09:44,460 --> 00:09:46,550 내 이름은 롭 보우 든,이 15이었다. 171 00:09:46,550 --> 00:09:52,726