ROB BOWDEN: Hi. Ek is Rob, en ek hoop dat jou spel vir die spel van 15. Nou, daar is vier funksies wat jy nodig het te implementeer in hierdie program - init, trek, beweeg, en gewen. So, laat ons kyk na init. Hier sien ons die eerste ding wat ons is gaan doen, is verklaar 'n veranderlike genoem toonbank. Dit gaan geïnisialiseer word te d keer d minus 1. Onthou dat D die dimensie van ons raad. Hoe init gaan werk is dit gaan te Itereer oor die hele direksie en ons gaan om te begin links bo. En laat ons net sê ons het 'n 4 by 4 raad. So het die top verlaat ons gaan om te sê, is 15. En dan is ons net gaan om te tel middel van die style, sê 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, en so aan. So het die top links, verwag ons om te wees d keer d minus 1, wat in die 4 by 4 geval gaan 16 minus te wees 1, wat is korrek 15. En hier is waar ons gaan Itereer oor die hele raad. En ons gaan elke posisie te stel in die raad aan die huidige waarde van ons toonbank, en dan toonbank gaan te decrement, sodat die volgende posisie wat ons bereik gaan hê counter een minder as die vorige posisie. So ons het aanvanklik 15 en Trek 'toonbank. So dan gaan ons wys 14 tot die volgende posisie, decrement toonbank, en ons gaan opgedra 13, en so aan. Ten slotte, moet ons die hoek te hanteer geval waar, indien die raad het 'n nog dimensie, dan net doen 15, 14, 13, 12, al die pad af tot 3, 2, 1, is gaan ons verlaat met 'n onopgeloste raad. En ons het om te ruil die 1 en die 2. Dus, as d mod 2 is gelyk aan 0, dis hoe ons gaan om te kyk om te sien of dit is selfs. As d mod 2 is gelyk aan 0, dan in ry D minus 1, wat is die onderste ry, en posisie d minus 2, of kolom d minus 2, ons gaan om dit te stel tot 2, en kolom d minus 3 ons gaan stel om 1. So dit is net die omkeer waar die 1 en 2 op die oomblik is. Ten slotte, ons gaan na die baie ingestel onder regs gelyk aan leë, waar leeg is hash gedefinieer aan die bokant as 0. So, dit was nie streng nodig, aangesien dit vir lus gaan hê stel die onderkant reg om 0, aangesien toonbank sal natuurlik bereik 0. Maar wat staatmaak op ons om te weet dat leeg is hashed n 0 te vind. As ek gaan in hierdie program en later verander leeg by die top 100, is dit moet nog werk. So dit is net om seker te maak dat die regs onder is eintlik gelyk aan ons leë waarde. Ten slotte, ons het twee globale veranderlikes, so leeg en ek leeg j, en ons sien diegene verklaar aan die bokant. En ons gaan die twee globale te gebruik veranderlikes spoor van die te hou posisie van die leë, sodat ons dit nie doen nie nodig het om te kyk deur die hele boord van die leë elke enkele te vind tyd dat ons probeer om 'n skuif te maak. So het die posisie van die leë altyd is gaan om te begin aan die onderkant regs. So die onderkant regs gegee word deur indekse d minus 1, d minus 1. So, dit is init. Nou beweeg ons op te trek. So, is gelykop gaan dieselfde wees waar ons gaan Itereer oor die hele raad. En ons wil net die waarde te druk dit is in elke posisie van die raad. So hier is ons die waarde wat die druk in elke posisie van die raad. En sien dat ons doen -. En dit is net vertel dat printf ongeag of dit 'n een syfer of twee-syfer-nommer, wat ons nog wil om dit te neem twee kolomme in die gedrukte uit, sodat as ons twee syfer en een syfer getalle in die dieselfde raad, ons raad sal steeds mooi en vierkante. So ons wil om dit te doen vir elke waarde in die raad, behalwe vir die leeg. So, as die posisie in die raad is gelyk aan die leë, dan het ons spesifiek wil uit te druk net 'n underscore die leë te stel, in plaas van ongeag die waarde van die leë eintlik is. Ten slotte, ons wil druk 'n nuwe lyn. Let daarop dat hierdie is nog in die buitenste lus, maar buite die binneste lus. Aangesien hierdie buitenste lus vir 'iterating oor al die rye, en so die printf is gaan net druk 'n nuwe lyn, sodat ons beweeg na die druk van die volgende ry. En dit is dit vir die trekking. So, laat ons nou beweeg op te skuif. Nou, ons slaag skuif, die teël wat die gebruiker is opgeneem in die spel - hulle Tik die teël hulle wil beweeg - en jy is veronderstel om 'n Bool om terug te keer, sodat waar of vals is, afhangende van of dit skuif was eintlik geldig - of dit teël kan wees verhuis na die leë ruimte. So hier het ons verklaar 'n plaaslike veranderlike, tile_1 en tile_j, wat gaan wees soortgelyk aan blank_i en blank_j, behalwe dit gaan die spoor van die te hou posisie van die teël. Nou hier gaan ons om te gebruik blank_i en blank_j en sê alles reg, sodat hier is die leë op die bord. Nou, is die teël bo die leë? Is die teël aan die linkerkant van die leë? Is die teël aan die regterkant van die leë? Is die teël onder die leë? Dus, as die teël is in enige van daardie posisies, dan weet ons dat die teël kan in die leë plek verskuif word en die leë verskuif kan word na die plek waar die teël is tans. So hier is, sê ons as raad by posisie blank_i minus 1 blank_j. So dit sê, is die teël bo die huidige leeg? En as dit so is, gaan ons om te onthou dit is die posisie van die teël. Die teël is in posisie blank_i minus 1 en blank_j. nou eers, ons het ook die tjek reg hier, so blank_i is groter as 0. Waarom wil ons dit te doen? Wel, as die leë is in die boonste ry van die direksie, dan wil ons nie te kyk bo die leë vir die teël sedert daar is niks behalwe die top ry van die direksie. Dit is hoe jy kan uiteindelik kry iets soos 'n segmentering skuld of jou program mag dalk net werk in onverwagse maniere. So, is dit om seker te maak dat ons dit nie doen nie kyk in plekke wat nie geldig is. Nou gaan ons dieselfde ding om te doen vir alle ander moontlike kombinasies. So hier is, is ons op soek onder die oop om te sien of dit is die teël. En ons het ook om seker te maak ons ​​is nie op die onderste ry, anders sal ons moet nie kyk vir die teël. Hier gaan ons kyk na die linkerkant van die leë om te sien of dit is die teël. En ons moet nie kyk na links As ons in die linker kolom. En hier gaan ons kyk na die regs van die leë, en ons moet nie kyk na die reg as ons in die regterkantste kolom. Dus, as een van daardie dinge waar was, wat beteken dat die teël was nie aangrensende na die leë en ons kan terugkeer onwaar. Die skuif was nie geldig nie. Maar, as een van daardie waar is, dan ten hierdie punt, ons weet dat tile_i en tile_j is gelyk aan die posisie van die teël. En so kan ons die raad by te werk posisies tile_i en tile_j. Ons weet dat die nuwe waarde sal die leë wees en dat die posisie blank_i blank_j, wat was die oorspronklike leeg - ons weet die teël gaan beweeg daar. Sien ons nie eintlik hoef te doen om 'n werklike ruil hier, aangesien ons weet dat die waardes wat ingevoeg word moet in daardie posisies. Ons hoef nie 'n tydelike veranderlike rond. Ten slotte, moet ons onthou dat ons het ons globale veranderlikes wat hou van die posisie van die leë. So wil ons die posisie van te werk die leë waar die teël te wees oorspronklik was. Ten slotte, ons terug waar nie, aangesien die skuif was suksesvol. Ons suksesvol ruil die leë met die teël. Alle reg, sodat ons laaste nodig gewen om seker te maak. So, het insgelyks gee 'n Bool waar ware gaan om aan te dui dat die gebruiker het die wedstryd gewen. En vals is wat aandui dat die spel is nog aan die gang. Die gebruiker het nie gewen het. So, is dit gaan wees pretty much die teenoorgestelde van init, waar init, onthou, ons inisialiseer die direksie 15, 14, 13, 12, ensovoorts. Terwyl gewen het, ons wil om te kyk of die direksie is 1, 2, 3, 4, 5, en so aan. So, gaan ons inisialiseer ons werk tot 1 want dit is wat die top links van die raad moet wees. En dan gaan ons lus oor die hele raad. Kom ons ignoreer hierdie toestand vir 'n tweede. En hierdie toestand is net gaan om te tjek is om die direksie by hierdie posisie gelyk is aan die huidige aanklagte? As dit so is, inkrementeer die telling so dat die volgende posisie ons kyk na een hoër as die posisie is ons op die oomblik. So dit is hoe ons die links bo moet wees 1. Inkrementeer die telling tot 2. Kyk na die volgende posisie. Is dit 2? As dit so is, inkrementeer die telling tot 3. Volgende posisie, is dit 3? As dit so is, inkrementeer die telling tot 4, en so aan. So, as daar enige posisie op die raad wat nie ons telling gelyk, dan wil ons valse sedert die terugkeer beteken daar is 'n paar teël wat nie in die regte posisie. So hier is, wat is hierdie toestand te doen? Wel, onthou dat die leë is veronderstel is om te gaan op die onderkant regs. En die leë se waarde mag nie noodwendig die waarde van die gelyke werk wat gaan bereik word aan die onderkant regs. So het ons spesifiek wil om te kyk of ek gelyk is gelyk aan d minus 1 en j gelykes gelyk aan d minus 1 - wat sê as ons is op soek na die onderkant regs van die raad - dan moet ons net wil voortgaan. Ons wil hierdie spesifieke te slaan iterasie van die lus. En so, as ons beheer te kry deur middel van hierdie geneste for-lus, wat beteken dat daar was geen teël wat in die verkeerde posisie. En ons breek uit van die lus en kom hier waar ons kan terugkeer waar. Alle teëls in die korrekte posisies en dit beteken dat die gebruiker het die wedstryd gewen. En dit is dit. My naam is Rob Bowden, en dit was 15.