1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Прывітанне. 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 Гэта збіраецца быць ініцыялізаваны у г раз г мінус 1. 10 00:00:37,620 --> 00:00:40,200 Памятаеце, што г-памернасць нашай дошцы. 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 Такім чынам, верхні левы, мы чакаем, што г раз г мінус 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 Так што, калі г па модулю 2 роўны 0, гэта як мы збіраемся праверыць 32 00:01:52,930 --> 00:01:54,410 каб убачыць, калі гэта нават. 33 00:01:54,410 --> 00:01:59,810 Калі г па модулю 2 роўная 0, то ў радку г мінус 1, што ніжні шэраг, і 34 00:01:59,810 --> 00:02:05,430 пазіцыя г-мінус 2, або слупок г мінус 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 Такім чынам, ніжні правы даецца індэксы г мінус 1, д мінус 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 Паколькі гэты знешні для цыклу ітэрацыі па ўсіх радках, і такім чынам гэта Е з'яўляецца 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 да нарыхтоўкі, і мы можам вярнуцца ілжывым. 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 Нарэшце, мы вяртаемся дакладна, так як гэты крок быў паспяховым. 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 Так, выйграў ж вяртае лагічнае значэнне, дзе праўда збіраецца паказваюць, што 132 00:07:39,900 --> 00:07:41,460 Карыстальнік выйгралі гульню. 133 00:07:41,460 --> 00:07:43,780 І хлусня паказвае, што гульня працягваецца да гэтага часу. 134 00:07:43,780 --> 00:07:46,340 Гэты элемент яшчэ не выйграў. 135 00:07:46,340 --> 00:07:52,100 Такім чынам, гэта будзе ў значнай ступені супрацьлегласць ініцыялізацыі, дзе ініцыялізацыі, 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 Затым мы хочам вярнуцца ілжывым, так як гэта азначае, што ёсць некаторыя пліткі, што з'яўляецца 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 Такім чынам, мы адмыслова хочаце праверыць, калі я роўная роўная г мінус 1 і J роўных 161 00:09:15,760 --> 00:09:19,470 роўная д мінус 1 - які кажа, калі мы глядзіце на правым ніжнім куце 162 00:09:19,470 --> 00:09:22,050 савет - тады мы проста хочаце працягнуць. 163 00:09:22,050 --> 00:09:26,200 Мы хочам, каб прапусціць гэты канкрэтны ітэрацыя для завесы. 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 І мы вырвацца з пятлі і прыйсці тут, дзе мы можам вярнуцца дакладна. 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