ROB BOWDEN: Прывітанне. Я Роб, і я спадзяюся, што вашы гульні для гульні 15. Зараз ёсць чатыры функцыі, якія вы павінны для рэалізацыі ў гэтай праграме - ініцыялізацыі, маляваць, перамяшчаць, і выйграў. Такім чынам, давайце паглядзім на ініцыялізацыі. Тут мы бачым, першае, што мы знаходзімся збіраюся зрабіць, гэта аб'явіць зменную называецца лічыльнік. Гэта збіраецца быць ініцыялізаваны у г раз г мінус 1. Памятаеце, што г-памернасць нашай дошцы. Як ініцыялізацыі будзе працаваць гэта адбываецца для перабору ўсёй канферэнцыі і мы збіраемся пачаць у левым верхнім куце. І давайце проста сказаць, што мы ёсць 4 па 4 дошкі. Такім чынам, верхні левы мы збіраюся сказаць, 15. А потым мы проста будзем лічыць праз дошкі, кажучы 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, і гэтак далей. Такім чынам, верхні левы, мы чакаем, што г раз г мінус 1, які ў 4 на 4 справа будзе 16 мінус 1, што правільна 15. А цяпер вось дзе мы збіраемся перабору ўсёй канферэнцыі. І мы збіраемся ўсталяваць кожную пазіцыю ў дошка для бягучага значэння наш лічыльнік, а затым супраць збіраецца для памяншэння, так што наступны становішча мы дасягаем будзе мець лічыльнік на адзін менш, чым папярэдняе становішча. Такім чынам, мы першапачаткова былі 15 і паменшыць лічыльнік. Такім чынам, што мы збіраемся прызначыць 14 да Наступнае месца, декремент лічыльніка, і мы збіраемся прызначаны 13, і гэтак далей. Нарэшце, мы павінны справіцца з гэтым кут выпадак, калі, калі на поплатку ёсць яшчэ вымярэнне, то проста раблю 15, 14, 13, 12, усё, аж да 3, 2, 1, з'яўляецца збіраецеся пакінуць нас з невырашальная дошка. І ў нас ёсць, каб памяняць 1 і 2. Так што, калі г па модулю 2 роўны 0, гэта як мы збіраемся праверыць каб убачыць, калі гэта нават. Калі г па модулю 2 роўная 0, то ў радку г мінус 1, што ніжні шэраг, і пазіцыя г-мінус 2, або слупок г мінус 2, мы збіраемся ўсталяваць, што ў 2, і Калонка D мінус 3 мы збіраецца ўсталяваць ў 1. Так што проста заднім ходам, дзе 1 і 2 у цяперашні час. Нарэшце, мы збіраемся ўсталяваць вельмі унізе справа роўны пусты, дзе пусты быў хэш вызначаны уверсе як 0. Так, што не з'яўляецца абсалютна неабходным, так як гэта цыкл будзе мець ўсталяваць ніжнюю права на 0, так як Лічыльнік, натуральна, дасягнуць 0. Але гэта залежыць ад нас, ведаючы, што пусты быў хэширован знайсці 0. Калі я іду ў гэтую праграму, а затым змяніць пустая радок у верхняй да 100, гэта яшчэ павінен працаваць. Так што гэта толькі пераканаўшыся, што унізе справа на самай справе роўная нашай пустое значэнне. Нарэшце, у нас ёсць дзве глабальныя зменныя, так пусты я і пусты J, і мы бачым, тых, якія абвешчаныя на самым версе. І мы збіраемся выкарыстаць гэтыя два глабальных зменныя для адсочвання Становішча нарыхтоўкі, так што мы не трэба глядзець праз увесь дошка знайсці нарыхтоўкі кожны раз мы стараемся зрабіць ход. Такім чынам, становішча нарыхтоўкі заўсёды збіраецца пачаць у правым ніжнім куце. Такім чынам, ніжні правы даецца індэксы г мінус 1, д мінус 1. Такім чынам, вось ініцыялізацыі. Цяпер мы пяройдзем да маляваць. Так, нічыя будзе падобны куды мы ідзем для ітэрацыі над форумам. І мы проста хочам, каб надрукаваць значэнне вось у кожным становішчы дошкі. Дык вось, мы друку значэння, у кожным становішчы дошкі. І заўважце, што мы робім -. І гэта толькі кажа Printf, што незалежна ад таго, калі гэта адна лічба ці двухзначны лік, мы ўсё яшчэ хочам, каб ён заняць да двух слупкоў ў раздрукоўцы, так што калі ў нас ёсць два лічбу і адзін знакавых лікаў у адной плаце, наш Савет будзе па-ранейшаму выглядаць прыгожа і квадрат. Такім чынам, мы хочам зрабіць, што для кожнага значэння ў савеце, для нарыхтоўкі выключэннем. Так што, калі становішча ў савеце роўна нарыхтоўкі, то мы спецыяльна хочаце раздрукаваць толькі падкрэсліванне прадстаўляць пустым, замест таго, каб незалежна ад значэння пусты на самай справе. Нарэшце, мы хочам надрукаваць з новай лініі. Звярніце ўвагу, што гэта па-ранейшаму ўнутры Знешні цыкл, але за межамі ўнутраны цыкл. Паколькі гэты знешні для цыклу ітэрацыі па ўсіх радках, і такім чынам гэта Е з'яўляецца збіраецца проста надрукаваць новую лінію, таму мы перайсці да раздрукаваць наступны радок. І гэта ўсё за нічыю. Такім чынам, цяпер давайце пяройдзем рухацца. Пяройдзем цяпер крок, плітку, што карыстальнік увайшоў у гульню - яны увядзіце плітку яны хочуць рухацца - і ты павінен вяртаць лагічнае значэнне, так сапраўдным або ілжывых, у залежнасці ад ці быў гэты крок на самай справе сапраўды - ці можа, што плітка будзе пераехаў у пустое прастору. Дык вось, мы абвясціць лакальную зменную, tile_1 і tile_j, якія збіраюцца быць падобны на blank_i і blank_j, за выключэннем таго, што адбываецца, каб адсочваць Становішча пліткі. Цяпер вось, мы збіраемся выкарыстаць blank_i і blank_j і сказаць усё ў парадку, так вось пусты на дошцы. Цяпер, з'яўляецца вышэй нарыхтоўкі плітка? З'яўляецца плітка злева ад нарыхтоўкі? З'яўляецца плітка справа ад нарыхтоўкі? Ці з'яўляецца плітка ніжэй нарыхтоўкі? Так, калі плітка знаходзіцца ў адным з тых, пазіцыі, то мы ведаем, што плітка могуць быць перамешчаныя ў пустым месцы і пусты могуць быць перамешчаныя у якім плітка ў цяперашні час. Дык вось, мы гаворым, калі плата ў становішчы blank_i мінус 1 blank_j. Так што гэта кажа з'яўляецца плітка вышэй бягучай нарыхтоўкі? І калі гэта так, мы збіраемся, каб памятаць што гэта пазіцыя пліткі. Плітка знаходзіцца ў становішчы blank_i мінус 1 і blank_j. Цяпер спачатку, у нас таксама ёсць гэтую праверку прама тут, так blank_i з'яўляецца большае за 0. Чаму мы хочам, каб гэта зрабіць? Ну, калі нарыхтоўка знаходзіцца ў верхнім шэрагу праўлення, то мы не хочам, каб глядзіце вышэй нарыхтоўкі для пліткі з няма нічога вышэй верхняй шэраг дошкі. Гэта, як вы маглі б у канчатковым выніку атрымаць нешта накшталт памылкі сегментацыі або ваша праграма можа спрацаваць самым нечаканым чынам. Так, у гэтым пераканаўшыся, што мы не робім шукаць у месцах, якія не сапраўдныя. Цяпер мы збіраемся зрабіць тое ж самае для ўсе іншыя магчымыя камбінацыі. Дык вось, мы з нецярпеннем ніжэй нарыхтоўкі каб убачыць, калі гэта плітка. І мы таксама павінны пераканацца, што мы не ў ніжнім шэрагу, інакш мы не трэба шукаць пліткі. Тут мы будзем глядзець злева ад нарыхтоўкі, каб пераканацца, што гэта плітка. І мы не павінны глядзець налева калі мы ў крайнім левым слупку. І тут мы будзем глядзець, каб Права нарыхтоўкі, і мы не павінны паглядзіце направа, калі мы ў правай калонцы. Так што, калі ні адна з гэтых рэчаў не было праўдай, гэта азначае, што плітка ня быў змружыць да нарыхтоўкі, і мы можам вярнуцца ілжывым. Гэты крок не быў сапраўдны. Але, калі адзін з тых, было праўдай, то, па крайняй гэтая кропка, мы ведаем, што tile_i і tile_j роўныя Становішча пліткі. І так, мы можам абнавіць дошку ў пазіцыі tile_i і tile_j. Мы ведаем, што новае значэнне будзе пустым і што становішча blank_i blank_j, які быў арыгінальным пусты - мы ведаем, што плітка будзе пераехаць туды. Звярніце ўвагу, мы на самой справе не трэба рабіць рэальная замена тут, так як мы ведаем, значэнні, якія павінны быць устаўленыя у гэтых пазіцыях. Нам не трэба часовае Пераменная вакол. Нарэшце, мы павінны памятаць, што мы ёсць нашы глабальныя зменныя, якія адсочванне пазіцыі нарыхтоўкі. Таму мы хочам, каб абнавіць становішча нарыхтоўкі быць там, дзе плітка першапачаткова быў. Нарэшце, мы вяртаемся дакладна, так як гэты крок быў паспяховым. Мы паспяхова памяняць пусты з пліткай. Добра, у мінулым мы трэба праверыць вон. Так, выйграў ж вяртае лагічнае значэнне, дзе праўда збіраецца паказваюць, што Карыстальнік выйгралі гульню. І хлусня паказвае, што гульня працягваецца да гэтага часу. Гэты элемент яшчэ не выйграў. Такім чынам, гэта будзе ў значнай ступені супрацьлегласць ініцыялізацыі, дзе ініцыялізацыі, памятаеце, мы ініцыялізаваць дошка да 15, 14, 13, 12, так далей. У той час як выйграў, мы хочам праверыць, калі Плата 1, 2, 3, 4, 5, і гэтак далей. Так, мы збіраемся, каб ініцыялізаваць наш супрацьстаяць да 1 так як гэта тое, што верхняя Злева ад дошкі павінна быць. А потым мы збіраемся завесы над форумам. Давайце праігнаруем гэта ўмова ні на секунду. І гэта ўмова толькі збіраецца праверка савет у гэтым становішчы роўнымі бягучых артыкулах? Калі гэта так, павялічыць лічыльнік так, каб Наступнае месца мы глядзім на адзін вышэй чым становішча мы знаходзімся на дадзены момант. Дык вось, як мы атрымліваем уверсе злева павінна быць 1. Павялічваюць колькасць да 2. Паглядзіце на наступную пазіцыю. Гэта 2? Калі гэта так, павялічыць лічыльнік 3. Наступная пазіцыя, гэта 3? Калі гэта так, павялічыць лічыльнік 4, і гэтак далей. Так, калі ёсць пазіцыя па плата, якая ня роўная наш рахунак, Затым мы хочам вярнуцца ілжывым, так як гэта азначае, што ёсць некаторыя пліткі, што з'яўляецца не ў правільным становішчы. Дык вось, што ж гэта ўмова робіць? Ну, памятаеце, што нарыхтоўка павінен ісці ў правым ніжнім куце. І значэнне пустой не маглі б абавязкова раўняцца кошту пярэчаць, што збіраецца быць дасягнута у правым ніжнім куце. Такім чынам, мы адмыслова хочаце праверыць, калі я роўная роўная г мінус 1 і J роўных роўная д мінус 1 - які кажа, калі мы глядзіце на правым ніжнім куце савет - тады мы проста хочаце працягнуць. Мы хочам, каб прапусціць гэты канкрэтны ітэрацыя для завесы. Дык вось, калі нам удасца прайсці праз гэта укладзенымі цыкл, што азначае, што не было плітка, якая была ў няправільнае становішча. І мы вырвацца з пятлі і прыйсці тут, дзе мы можам вярнуцца дакладна. Усе пліткі былі ў правільнай пазіцыі і гэта азначае, што карыстальнік мае выйграў гульню. І гэта ўсё. Мяне клічуць Боб Боуден, і гэта было 15.