Backtracking. Kapitel Att hitta rätt i labyrinten. Figur 8.1: Även om man går lite fel i början kommer man ändå fram till slut,
|
|
- Alf Blomqvist
- för 6 år sedan
- Visningar:
Transkript
1 Kapitel 8 Backtracking Figur 8.1: Även om man går lite fel i början kommer man ändå fram till slut, 8.1 Att hitta rätt i labyrinten Vi inleder kapitlet om backtracking med ett exempel där man ska ta sig genom en labyrint. I figur 8.1 är utmärkt var starten går och var målet finns. Det är inte alls svårt att med blotta ögat finna den rätta vägen, men hur ska vi kunna lära en dator att söka sig fram i en labyrint? Eftersom labyrinten i detta exempel är ganska liten borde det inte ta så lång stund för ett program att hitta fram genom en slumpmässig vandring. Denna metod räknar vi inte som ett alternativ, speciellt inte då labyrinten kan vara betydligt större. På något sätt måste vi beskriva labyrinten för datorn. En matris fungerar bra här. Vi beskriver väggarna med ett värde och golvet med ett annat. En systematisk promenad där programmet hela tiden håller reda på var man varit, så att inga försök upprepas beskrivs här 1
2 8.1. ATT HITTA RÄTT I LABYRINTEN Algorithm 8.1.1: LUBBARUNTEN(labyrint, arad, akol, nr) labyrint[arad][akol] vägg if arad = mrad and akol = mkol then Framme efter nr steg if Ledigt uppåt then LUBBARUNTEN(labyrint, arad 1, akol, nr + 1) else if Ledigt nedåt then LUBBARUNTEN(labyrint, arad + 1, akol, nr + 1) if Ledigt vänster then LUBBARUNTEN(labyrint, arad, akol 1, nr + 1) if Ledigt höger then LUBBARUNTEN(labyrint, arad, akol + 1, nr + 1) labyrint[arad][akol] golv 1 Indata är matrisen labyrint, som håller reda på labyrintens utseende. vägg och golv är de två möjliga värdena. arad och akol håller reda på var vi befinner oss. Dessa variabler får ett värde vid starten som sedan uppdateras för varje steg. nr håller reda på hur många steg vi tagit. När steget är taget murar vi igen bakom oss genom att placera en vägg i labyrinten. mrad och mkol håller reda på var målet är beläget. Om dessa är lika med motsvarande arad och akol betyder det att vi nått målet och kan skiva ut hur många steg som behövdes genom nr. I annat fall är det dags att ta ett steg till. Med hjälp av fyra if-satser tittar vi oss om i de fyra riktningarna. Så fort vi finner ett steg som är möjligt att ta, så tar vi det. Vi anropar alltså LubbaRunten med delvis nya parametrar. Denna rekursiva process fortgår tills vi, antingen når målet eller inte kan ta något mer steg. I det senare fallet betyder det att ingen av de fyra villkoren är sant det blir inget anrop från denna nivå och LubbaRunten kommer till sista satsen, vilken innebär att man tar bort vägg och placerar ett golv här igen. (Det är bara att hoppas att murbruket inte hunnit torka). Men när vi lämnar en nivå så kommer vi till anropet strax innan. Här finns kanske fler villkor i if-satserna att testa och skulle något av dem vara sant så sticker vi iväg åt det hållet istället. Finns det en lösning så kommer vi att hitta den. Hur många gånger kommer villkoret framme att bli sant för vårt exempel på labyrint? Jo, två gånger det finns två olika vägar till målet. Den ena snabbaste kräver 46 steg. Den andra 4 steg ytterligare 50. Nu är det kanske inte så spännande att bara få reda på hur många steg som behövs för att 1 Algoritmens namn kommer från den kända gåtan: Vad gjorde laboranten i labyrinten? Jo, han lubbarunt en Håkan Strömberg 2 KTH Syd
3 KAPITEL 8. BACKTRACKING nå målet. Genom att lagra arad och akol i en lista, med nr som index, kommer vi att ha hela vandringen bokförd när vi når målet. Ännu trevligare är förstås att visa vägen grafiskt. 8.2 Åtta damer på schackbrädet Att placera ut åtta damer på ett schackbräde så att inga damer står i slag för varandra är ett klassiskt problem som till och med Gauss matematikens konung roade sig med. I figur 8.4 ser Du en av flera möjligheter att åstadkomma detta. En dam står i slag för en annan om de båda står på samma rad, kolumn eller diagonal. Figur 8.2: I de vackra damernas frånvaro får de svarta markerna träda in. Vårt mål är nu att skriva ett program som söker upp resten av lösningarna. Vi ska använda oss av backtracking igen. Vi placerar ut en dam i taget på brädet tills vi finner en lösning eller tills det inte finns någon ny plats. När vi funnit en lösning (och noterat det) eller kört fast börjar vi plocka bort damer och placerar i stället in dem på andra platser. Så här ser en typisk algoritm för backtracking ut. Algorithm 8.2.1: ADDQUEEN(rad) for kolumn 1 to 8 if kolumn möjlig boka platsen if rad = 8 do then then SKRIVUT( ) else ADDQUEEN(rad+1) avboka platsen Håkan Strömberg 3 KTH Syd
4 8.2. ÅTTA DAMER PÅ SCHACKBRÄDET Vad som är typiskt är att man, i en lista, markerar vad som utförts. Blockerar eller noterar för att sedan går vidare, egentligen med ett nytt, mindre, problem, med färre damer. När man så småningom kommer tillbaka efter det rekursiva anropet återställer man, tar bort blockeringen eller noteringen. Det enda egentliga problem som återstår är att bestämma sig för hur bokningen ska ske, vilken datastruktur man vill ha. Det första man kommer att tänka på för detta speciella problem är en 8 8 matris där man sätter in, till exempel 1:or, för att markera damer. Arbetet med att ta reda på om en utvald plats är möjlig blir då att titta efter damer i alla 8 riktningarna från aktuell ruta. Vi ska dock tänka lite till för att slippa en mängd dubbla for-loopar. Det kommer att hamna precis en dam i varje rad och en i varje kolumn. Vår algoritm stegar fram en rad i taget och placerar vid varje anrop in en dam (om det nu går) på en rad som tidigare var utan. När programmet lyckats placera en dam på rad 8 vet vi därför att vi funnit en lösning. För att veta i vilken kolumn, damen på en viss rad, hamnar behöver vi en array med 8 celler en för varje rad. Vi kallar denna array kolumn och kolumn[i] anger då i vilken kolumn damen på i:te raden finns. En array, kolfri får hålla reda på om en viss kolumn är ledig. kolfri[3]=1 innebär att det inte finns någon dam i kolumn 3, men kolfri[6]=0 talar om att det redan finns en dam i kolumn 6. För att ange en viss ruta behöver vi två index, radindex och kolumnindex. (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) Först ska vi skilja på två olika typer av diagonaler. Det finns dels 15 diagonaler som börjar längst till vänster eller på sista raden med riktning nordost. På samma sätt finns det nordvästliga diagonaler. Gemensamt för de nordostliga är att summan rad + kol är konstant inom samma diagonal! Två rutor med samma summa ligger på samma diagonal. Gemensamt för de nordvästliga är differensen rad-kol är konstant, även om den kan vara negativ. Detta ska vi utnyttja! Vi inrättar efter det ytterligare två boolska arrayer, uppfri och nerfri. Alla celler med värdet 1, ledig, från start. Vi kan nu skriva det villkor, som måste vara sant för att rutan [rad][kol] ska vara ledig för en dam. Håkan Strömberg 4 KTH Syd
5 KAPITEL 8. BACKTRACKING kolfri[kol] && uppfri[rad+kol] && nerfri[rad-kol+8] Platsbokningen består förstås sedan i att uppdatera de fyra arrayerna (även kolumn). UPPGIFT 8.1 Utskriftsrutin till damerna. Programmet damer.c saknar funktionen SkrivUt. Skriv den funktionen och passa samtidigt på att låta räkna antalet olika lösningar till problemet Hur bra är den här algoritmen? En annan metod, än den vi här använder, är att placera ut de 8 damerna på brädet och sedan ta reda på om placeringen innebar en lösning. Från kombinatoriken kan vi härleda följande uttryck ( ) 64 = Inte bra! Lite bättre blir det om vi bestämmer oss för att endast ha en dam i varje rad. 8 8 = Vår algoritm ligger snarare i närheten av 8! = , vilket är en munsbit för våra snabba datorer. UPPGIFT 8.2 Komplexitet för damproblemet. Även den senaste uppskattningen är en överskattning. Hur många anrop av funktionen AddQueen görs egentligen? Om man vill skaffa sig en uppfattning om T(n), så måste man lösa problemet för olika brädstorlekar. Ta reda på om T(n) ligger nära n! genom att anpassa programmet till olika värden för n och bestämma antalet anrop av AddQueen för 1 n 12. Använd sedan Fit i Maple för att bestämma en uppskattning av T(n) Håkan Strömberg 5 KTH Syd
6 8.3. SOLITÄR Vi avslutar detta avsnitt med ett program jag funnit på internet 1 #include <stdio.h> 2 int count; 3 4 void try(int row, int ld, int rd){ 5 if (row == 0xFF) 6 count++; 7 else{ 8 int poss = 0xFF & ~(row ld rd); 9 while (poss){ 10 int p = poss& poss; 11 poss = poss p; 12 try(row+p, (ld+p)<<1, (rd+p)>>1); 13 } 14 } 15 } 16 int main(int argc, char argv[ ]){ 17 printf("eight Queens\n"); 18 count = 0; 19 try(0,0,0); 20 printf("number of solutions is %d\n", count); 21 exit(0); 22 } UPPGIFT 8.3 Åtta damer på brädet. Förklara detta program för mig och hela klassen, så att vi alla begriper hur det fungerar. 8.3 Solitär Lika känt som damerna på schackbrädet är spelet Solitär. Av namnet förstår vi att det är frågan om ett spel för en person ett slags pussel. I figur 8.3 ser vi 32 kulor i ett kors med platsen i mitten tom. Kulor kan hoppa ortogonalt, (alltså ej diagonalt) över en annan kula, under förutsättning att det är tomt direkt bakom. Den överhoppade kulan tas bort. Efter 31 drag ska bara en kula finnas kvar. Inledningsvis finns fyra drag, som på grund av symmetrin kan betraktas som likvärdiga. Vi önskar nu ett program som kan ge oss åtminstone en lösning. Finns det en lösning har vi anledning att tro att det finns många, på grund av så kallade dragomkastningar. Algoritmen, i bästa backtracking-stil Håkan Strömberg 6 KTH Syd
7 KAPITEL 8. BACKTRACKING Figur 8.3: Många av er har säkert sett detta soltärspel och kanske försökt lösa problemet. Här ska vi nu finna en lösning med hjälp av datorn Algorithm 8.3.1: NÄSTADRAG(nr) if nr = 31 then LÖSNINGFUNNEN DRAGGENERERING(lista, n) else for k 1 to n UTFÖRDRAG(k) do NÄSTADRAG(nr + 1) ÅTERSTÄLLDRAG(k) Det är funktionen nästadrag som är programmets hjärta, men det återstår en hel del administration innan man kan sätta igång med kodningen. Datastruktur Lämplig som datastruktur är en matris. Att den bör vara av storleken och inte 7 7 förklaras här. Figur 8.4: En situation i spelet Håkan Strömberg 7 KTH Syd
8 8.3. SOLITÄR De ljusgrå rutorna är platser utanför spelplanen, de vita är kulor och de mörkgrå är tomma platser. När man ska bestämma till vilka platser den utmärkta kulan i (5,2) kan flytta finns det fyra riktningar att studera. Vi vill då ha reda på om den närmaste platsen innehåller en kula och om den längre bort är tom. Om matrisen har 7 rader och 7 kolumner kommer man att hamna utanför den, när man tittar åt vänster. För att hela tiden slippa testa, om det är tillåtet att titta i en viss riktning, utökar vi spelplanen med en ram, som gör att vi hela tiden håller oss på spelplanen. Lika viktigt är det att från början fylla matrisen med lämplig information så att dragen uppåt och nedåt i denna situation inte bokförs som möjliga. Vid initieringen bör vi fylla matrisen med tre olika värden: Tom plats Kula Otillåten plats Denna matris kan vi placera globalt. De som är motståndare till globala variabler får i stället öka antalet parametrar i funktionen nästadrag. Till datastrukturerna lägger vi dessutom en matris av storleken 32 6 som ska innehålla information om tillåtna drag. 32 är förstås en grov överdrift eftersom vi aldrig når en situation där alla 32 kulorna kan flyttas (kom gärna på ett bättre värde). För varje drag behöver vi sex olika tal. rad och kolumn för platsen där kulan just nu finns rad och kolumn för platsen där kulan som ska hoppas över finns rad och kolumn för platsen dit kulan ska flyttas. Funktioner Förutom funktionen nästadrag behöver vi en funktion som initierar spelplanen, enligt ovan, innan spelet börjar. Vi behöver dessutom funktionen draggenerering som fyller på dragmatrisen med alla i ställningen möjliga drag. Eftersom denna matris är lokal, (det behövs en för varje ny ställning) behövs den som parameter tillsammans med n som håller reda på hur många drag som finns. Funktionerna utfördrag och återställdrag blir så korta att koden med fördel kan skrivas in i funktionen nästadrag. Här ska man alltså omsätta informationen i dragmatrisen till en förändring på spelplanen som senare skall återställas. Håkan Strömberg 8 KTH Syd
9 KAPITEL 8. BACKTRACKING UPPGIFT 8.4 Spara dragen till Solitär. När funktionen lösningfunnen anropas finns inget annat att göra än att skriva Ja, det fanns en lösning. Ingenstans har vi lagrat dragen fram till målet och kan därför inte skriva ut lösningen. Utöka därför programmet solitar.c så att dragen bokförs vartefter de utförs. När man når målet har man så hela dragföljden och kan skriva ut den till en fil. Om du formaterar filen så att den innehåller ett drag per rad med samma data i samma ordning som dragmatrisen, kan du använda programmet SpelarUppSolitär för att spela upp din lösning. Programmet använder (5, 5) för spelplanens mitt Använd höger musknapp för att få fram programmenyn. UPPGIFT 8.5 Var kan sista kulan hamna?. Det finns ett tillägg till solitär. Man vill bestämma var sista kulan ska hamna. Kanske är det vackrast om den hamnar i mitten? Om man tar hänsyn till symmetrin finns det sju olika platser där den sista kulan kan hamna. Finns det en lösning för alla dessa platser? Utöka programmet så att vi kan få svar på frågan. Observera att frågeställaren inte känner till svaret! 8.4 Att måla Att fylla en area på skärmen i grafisk mode, det som normalt floodfill i C s DOSgrafik gör kan vi härma med följande rekursiva funktion. Funktionen draw ritar först, med vita streck, en triangel på den svarta bildskärmen. Funktionen fill tar emot en x- och y-koordinat. Det är viktigt att denna pixel ligger inuti triangeln. 1 void draw(void){ 2 setcolor(white); 3 moveto(100,100); lineto(150,150); 4 lineto(150,100); lineto(100,100); 5 } 6 7 void fill(int x,int y){ 8 int n,x1,y1; 9 putpixel(x,y,white); 10 for(n=1;n<=4;n++){ 11 switch (n) { 12 case 1:{x1=x-1; y1=y;} break; 13 case 2:{y1=y-1; x1=x;} break; 14 case 3:{x1=x+1; y1=y;} break; 15 case 4:{y1=y+1; x1=x;} break; 16 } 17 if (getpixel(x1,y1)==black) fill(x1,y1); 18 } 19 } Håkan Strömberg 9 KTH Syd
10 8.5. PERMUTATIONER Funktionen fill målar direkt pixeln (x,y) vit. For-loopen påbörjar nu en snurra på fyra varv. Ett för varje riktning vänster, uppåt, höger, nedåt Funktionen tar i tur och ordning ett steg i varje riktning. Om denna pixel är svart anropar funktionen fill sig själv, med dessa koordinater som parametrar, vars motsvarande pixel inledningsvis målas vit. Och så vidare... Så småningom måste funktionen hamna i ett läge då ingen av de fyra riktningarna ger en svart pixel då sker heller inget nytt anrop utan återhopp sker. När exekveringen kommer tillbaka till ett gammalt anrop finns där förstås uppgifter om vilket värde n har och for-loopen kan snurra vidare. Tyvärr fungerar denna funktion bra endast för relativt små ytor som ska målas. Då ytan blir större kommer antalet anrop att växa och risk finns för att stacken ska bli full. Tekniken kommer ofta till användning i andra, än grafiska, tillämpningar. 8.5 Permutationer Bokstäverna ABC kan ordnas om på ytterligare fem sätt: ACB, BAC, BCA, CAB, CBA. Varje sådan ordning kallas en permutation av ABC. Det finns 6 permutationer för tre objekt, 3! = 6. På samma sätt kan 4 bokstäver ordnas på 4! = 24 sätt. Det finns många problem där man har anledning att generera alla permutationer av ett antal objekt. Tyvärr växer antal permutationer som bekant ganska raskt. Det är sällsynt att man, i en sådan undersökning, tror sig klara av fler än 13 objekt med sina 13! = permutationer. Håkan Strömberg 10 KTH Syd
11 KAPITEL 8. BACKTRACKING 1 #include <stdio.h> 2 void permute(int a[ ],int n,int v[ ],int p){ 3 int i; 4 if(n==p){ 5 for(i=0;i<n;i++) 6 printf("%d ",a[i]); 7 printf("\n"); 8 } 9 else 10 for(i=0;i<n;i++) 11 if(!v[i]){ 12 v[i]=1; 13 a[p]=i; 14 permute(a,n,v,p+1); 15 v[i]=0; 16 } 17 } 18 int main(void){ 19 int a[5],v[5]={0}; 20 permute(a,5,v,0); 21 } H I a hamnar talen 0 till n 1 i alla tänkbara n! ordningar. v använder vi för att boka av använda tal, där 0 betyder ej använt. p anger hur många tal vi nu placerat i a. När p = n har vi nått ett löv i rekursionsträdet och kan skriva permutationen. 13 Här flyttar vi in talet på rätt plats i a. Detta värde behöver inte återställas utan kommer bara att skrivas över senare. 15 Som vanligt är det viktigt att återställa bokningen. 5-7 Just den här gången skriver vi bara ut permutationen. En annan gång anropar vi en funktion där a är en parameter och utför någon beräkning på just den permutationen. UPPGIFT 8.6 Brickspel. I figur 8.5 visas utgångsläget i ett enkelt spel med sju rutor och sex brickor, tre svarta och tre vita. Uppgiften består i ett antal drag byta plats på de svarta och de vita brickorna och nå ställningen i delfigur 2. Delfigur 3 visar fyra tillåtna drag i en viss situation. Man får alltså flytta en bricka till den intilliggande rutan eller hoppa över en bricka och hamna på den tomma rutan. Man behöver inte alternera brickornas färg mellan dragen, utan kan till exempel flytta två vita brickor i följd. Skriv ett program som listar den unika dragföljden som når målet efter 15 drag då första draget görs med en svart bricka. Indata: - Håkan Strömberg 11 KTH Syd
12 8.5. PERMUTATIONER fig 1 fig 2 fig 3 Figur 8.5: Utdata: Den eftersökta dragföljden på formen 3 4, 5 3,... där siffrorna anger frånruta och tillruta enligt numrering i figur 8.5. Från hemsidan kan du ladda ner BRICKSOLITÄR. Klarar du det på 15 drag? UPPGIFT 8.7 Öar i skärgården. I figur 8.6 ser du en karta över en skärgård. De grå fälten utgör land och de vita är vatten. Du ska nu skriva ett program som utifrån en given karta bestämmer hur många öar skärgården har. Eftersom två landmassor, som endast har ett diagonalt förhållande till varandra, räknas som skilda öar, finns det i figuren 10 öar. Figur 8.6: Kartan visar 10 öar. Nere i vänstra hörnet ser vi två små öar Det finns ett antal färdiga kartor på datafiler, alla med namnet oar?.dat. Datafilen inleds med två heltal n < 20, för antalet rader (av rutor) och m < 20 för antalet kolumner. Därefter följer n rader med m tecken i varje, där x, står för land och o står för vatten. Extrauppgift: Du har fyllnadsmaterial i form av jord, motsvarande 4 rutor, var ska du placera den för att minimera antalet öar på kartan? Håkan Strömberg 12 KTH Syd
13 KAPITEL 8. BACKTRACKING Figur 8.7: Kan pusslet läggas med hjälp av 8 L-formade pusselbitar, där den grå rutan inte får övertäckas? UPPGIFT 8.8 Pussel med vinklar. I figur 8.7 nedan ser du ett bräde, 5 5 rutor stort. Till vänster ser du pusselbitar, som alla är av samma typ. De har bara vridits 90. Målet är nu att skriva ett program som täcker brädet med hjälp av 8 pusselbitar (vridna och vända). Observera, att den grå rutan dock inte får täckas. Hur många olika lösningar har pusslet för skilda placeringar av den grå rutan? B A C D E F G H I J K L M N O Figur 8.8: Figur till uppgift 4.6 UPPGIFT 8.9 Nytt solitärspel. Figur 8.8 visar ett solitärspel, enmansspel, med 14 kulor och ett hål (F). Målet är att efter tretton drag ha endast en kula kvar på brädet. Ett tillåtet drag är att med en kula hoppa över en intilliggande och hamna i ett tomt hål på andra sidan, varefter den överhoppade kulan avlägsnas. I figuren finns fyra möjliga drag AF, OF, MF och DF. Efter dessa drag avlägsnas motsvarande kulor i C, J, I och E. Skriv ett program som efterfrågar vilket hål som ska vara tomt vid spelets början och som sedan presenterar en lösning. För varje utgångsläge finns flera lösningar, men vi efterfrågar alltså endast en, som ska beräknas av programmet. Indata: Bokstaven som motsvarar det hål som ska vara tomt. Utdata: De tretton dragen som beskriver en lösning. Ett drag anges på formen <Bokstav Bokstav>, till exempel AD, där A anger från vilken position kulan flyttas och D till vilken position. Håkan Strömberg 13 KTH Syd
14 8.5. PERMUTATIONER UPPGIFT 8.10 Nokiaspel Figur 8.9: Till vänster ser vi en av många startmöjligheter. I mitten visas hur de fyra 2 2- kvadraterna kan roteras. Till höger visas målet. I flera av Nokias mobiltelefoner finns detta förströelsespel eller pussel. Pusslet går ut på att från ett givet, slumpmässigt utgångsläge, som till exempel till vänster i figur 8.9 nå fram till ordning och reda som till höger. I varje ställning finns åtta möjliga drag. Varje liten 2 2-kvadrat kan vridas 90 medurs eller moturs i taget. Efter fyra drag i följd och i samma riktning med samma kvadrat är utgångsställningen återuppnådd. Vi har undersökt att det aldrig behövs fler än 11 drag för att nå målet från vilken utgångsställning som helst. Din uppgift är att skriva ett program som tar emot en ställning och som bestämmer hur många drag den minst kräver för att nå målet. Ställningen ska skrivas in, rad för rad, till programmet som en sträng innehållande en permutation av siffrorna Utdata är en enda mening. Vilken ställning: Denna ställning kräver 6 drag Vi ger här ytterligare några testexempel alla med olika svårighetsgrad observera att vid ren backtracking kan det ta ganska lång tid för datorn att hitta lösningar till problem som kräver 10 och 11 drag. Ställning Kräver Ställning Kräver Håkan Strömberg 14 KTH Syd
15 KAPITEL 8. BACKTRACKING UPPGIFT 8.11 Resan Figur 8.10: I figur 8.10 ser Du en karta bestående av sju städer. Mellan städerna finns enkelriktade vägar, där pilen anger riktningen. Din uppgift blir att skriva en eller flera rutiner till det bifogade programmet uppg5.cpp, som finner en väg med start i stad 1 som går genom alla de n(n 20) städerna. Data läses från filen uppg5.dat av funktionen init. Denna funktion som lämnar ifrån sig en pekare till stad 1 och antalet städer på kartan ska du använda men inte ändra. struct stadtyp{ int nr; struct stadtyp *adr[4]; }; Varje stad består av ett dynamiskt allokerat objekt (struct stadtyp), som innehåller stadens nummer samt en array med tre pekare, index 1 till 3. (index 0 används inte). Om en av dessa pekare inte är NULL pekar den på en annan stad till vilket det är möjligt att färdas. Resultatet skrivs ut på en rad med städernas nummer i den ordning de besöks. Från exemplet ovan skrivs resultatet Resan: Resan börjar alltså alltid i stad 1 och får avslutas var som helst när samtliga städer har besökts. Varje test har minst en lösning. Om det finns flera olika resor som uppfyller villkoren så räcker det med att redovisa en av dessa. Håkan Strömberg 15 KTH Syd
16 8.5. PERMUTATIONER UPPGIFT 8.12 Vägar i en graf Figur 8.11: I figur 8.11 ser vi en graf. I denna uppgift ska Du skriva ett program som bestämmer antalet turer, som startar i nod 1 och slutar i nod n. Under resans gång ska alla noder i grafen besökas exakt en gång. Nod n är det högsta nodnumret i grafen. I vårt exempel är n = 8 och i testexemplen alltid n < 20. På filen UPPG6.DAT finns uppgifter om hur noderna är förbundna. Filen inleds med ett tal som anger n. Därefter kommer ett tal som anger hur många bågar (kanter), m,m < 100, grafen har. Filen avslutas med m rader där varje rad innehåller två tal nodnumren för de noder som förbinds av bågen. Programmet skriver endast ut en rad. Med vårt exempel får vi: Det finns 4 turer Vandringen revisited Vi upprepar frågeställningen: UPPGIFT 8.13 Vandringen Vi befinner oss i koordinaten (x,y) och vill hem till (0,0). Vår promenad är uppdelad i små promenader i rakt nordlig (8 steg), sydlig (3 steg), östlig (5 steg) och västlig (6 steg) riktning. Vilket är det minsta antalet små promenader vi behöver ta för att nå målet? Skriv ett program som använder sig av tekniken bredden först och med följande dialog Start x : 36 Start y : 27 Det krävs minst 15 små promenader Eftersom heapen är begränsad kan den bli full! Detta kan man hålla kontroll på genom: Håkan Strömberg 16 KTH Syd
17 KAPITEL 8. BACKTRACKING ny=(struct queuebox *) malloc(sizeof(struct queuebox)); if(ny==null){ printf("heapen full\n"); getch(); abort(); } Den post vi vill köa kan möjligtvis komprimeras till struct box{ char x,y,antal; }; struct queuebox{ struct box data; struct queuebox *next; }; box tar upp 3 byte tillsammans med pekaren, som tar upp 8 byte, får vi 11 byte/post. Vi förväntar oss att finna resultatet på nivå 15. Här finns 4 15 = noder på totalt byte, alldeles för stort för normala persondatorer. Sorry! Även om vi lyckas hitta fram tidigt på denna nivå finns 4 14 noder i kön från tidigare nivå. Djupet först Vet vi att resultatet för (36,27) ska bli 15 är det lätt att verifiera med hjälp djupet först: 1 #include <stdio.h> 2 int dragmin=100000, maxdrag=15; 3 void solve(int dragnr,int x, int y){ 4 if(x==0 && y==0){ 5 if(dragnr<=dragmin){ 6 dragmin=dragnr; 7 } 8 } 9 else 10 if(dragnr<maxdrag){ 11 solve(dragnr+1,x,y+8); 12 solve(dragnr+1,x,y 3); 13 solve(dragnr+1,x+5,y); 14 solve(dragnr+1,x 6,y); 15 } 16 } 17 int main(void){ 18 solve(0,36,27); 19 printf("minimum: %d\n",dragmin); 20 } Håkan Strömberg 17 KTH Syd
18 8.5. PERMUTATIONER Efter att ha undersökt noder hittar vi svaret 15. Man kan nå målet på 5005 olika sätt. Ersätter vi rad 10 med if(dragnr<maxdrag && dragnr<dragmin){ kan vi tjäna en del för problem som kräver färre än 15 promenader. Retrograde analysis Vi ger inte upp. Här följer en algoritm, som vi kan kalla bakåtanalys, som löser problemet på mindre än en sekund. Inte bara för efterfrågade x = 36 och y = 27 utan för nästan alla startkoordinater i [ 50 x 50, 50 y 50]. 1 #include <stdio.h> 2 int main(void){ 3 int plan[101][101],ok=1,y,x,level=0; 4 for(y=0;y<=100;y++) 5 for(x=0;x<=100;x++) 6 plan[y][x]= 1; 7 plan[50][50]=0; 8 while(ok){ 9 ok=0; 10 for(y=0;y<100;y++) 11 for(x=0;x<100;x++) 12 if(plan[y][x]==level){ 13 if(y 8>=0 && plan[y 8][x]== 1){ 14 plan[y 8][x]=level+1; 15 ok=1; 16 } 17 if(y+3<=100 && plan[y+3][x]== 1){ 18 plan[y+3][x]=level+1; 19 ok=1; 20 } 21 if(x 5<=100 && plan[y][x 5]== 1){ 22 plan[y][x 5]=level+1; 23 ok=1; 24 } 25 if(x+6>=0 && plan[y][x+6]== 1){ 26 plan[y][x+6]=level+1; 27 ok=1; 28 } 29 } 30 level++; 31 } 32 printf("(36,27) efter %d\n",plan[77][86]); 33 } 3 Vi deklarerar en array plan, där varje cell motsvarar en startkoordinat. Håkan Strömberg 18 KTH Syd
19 KAPITEL 8. BACKTRACKING 4-7 Arrayen 1-ställs. I [50][50] bestämmer vi oss för att origo (0,0), vårt mål ska ligga. Om man startar i (0,0) är man redan framme därför placerar vi 0 i denna cell Tanken är nu att placera talet 1 i de fyra punkter från vilka man kan ta sig till mål i ett drag. Vi går igenom hela matrisen och letar efter talet 0, det värde level har från början. När vi funnit det i [50][50] kan vi placera talet 1 i [42][50], [53][50], [50][45] och [50][56]. Vi hittar inga fler celler med talet 0. Ökar level till 1 och går igenom hela matrisen igen och söker efter celler med 1:or. Varje gång vi hittar en, expanderar vi den genom att titta i fyra riktningar. Vi aktar oss för att hamna utanför matrisen och sätter inte in några 2:or i de celler som redan har 1:or. Om flaggan ok inte slagit om under en hel genomsökning av matrisen betyder det att inga fler celler kan expanderas och rutinen avbryts. I plan finns nu tal som anger hur många drag det behövs för att nå målet. Några celler kan fortfarande innehålla talet 1. För dessa gäller att man måste gå utanför matrisen i några drag. Detta är ett exempel på en lösning där man börjar från målet och går baklänges. Har man bestämt sig för en viss koordinat redan innan man fyller i matrisen kan man sluta, så fort man når fram till aktuell koordinat. UPPGIFT 8.14 Hissen i lustiga huset för tredje gången. Lös problemet med denna teknik och med hjälp av penna och papper, då antalet våningar är 25. Upp-Knappen ger 5 våningar, Ned- Knappen ger 7 våningar och vi ska till våning 23. Hur många knapptryckningar blir det? En heuristisk algoritm I valet mellan de fyra möjliga promenaderna kan man tycka att man först bör utföra den promenad, som närmar sig målet mest. Vi kan inte bevisa att detta i allmänhet är ett bra val och med säkerhet är det inte alltid det bästa. Denna typ av intuitiva idéer kallas heuristiska. Tanken är att man relativt snabbt ska få en hyfsad lösning, som i fortsättningen gör det möjligt att utesluta stora delar av rekursionsträdet. Håkan Strömberg 19 KTH Syd
20 8.5. PERMUTATIONER 1 int dragmin=100000; 2 void genereradrag(int x,int y,int d[ ][3]){ 3 int steg[4][2]={{0,8},{5,0},{0, 3},{ 6,0}}; 4 int i,j,k,tmp; 5 for(i=0;i<4;i++){ 6 d[i][0]=x+steg[i][0]; 7 d[i][1]=y+steg[i][1]; 8 d[i][2]=abs(d[i][0])+abs(d[i][1]); 9 } 10 for(i=0;i<3;i++) 11 for(j=i+1;j<4;j++) 12 if(d[i][2]>d[j][2]) 13 for(k=0;k<3;k++){ 14 tmp=d[i][k]; 15 d[i][k]=d[j][k]; 16 d[j][k]=tmp; 17 } 18 } 5-9 Vi beräknar koordinaterna för de fyra dragen, samt den summa vi sedan ska sortera efter. Ju närmare målet vi hamnar genom draget desto högre upp i listan En vanlig bubbelsort. 1 void solve(int dragnr,int x, int y){ 2 int drag[4][3],i; 3 if(x==0 && y==0){ 4 if(dragnr<=dragmin) 5 dragmin=dragnr; 6 } 7 else 8 if(dragnr<dragmin){ 9 genereradrag(x,y,drag); 10 for(i=0;i<4;i++) 11 solve(dragnr+1,drag[i][0],drag[i][1]); 12 } 13 } 14 int main(void){ 15 solve(0,36,27); 16 printf("minimum: %d\n",dragmin); 17 } Håkan Strömberg 20 KTH Syd
21 KAPITEL 8. BACKTRACKING H Observera att vi nu släppt begränsningen på trädets djup. Vi räknar med att programmet ska hitta en bra lösning relativt snabbt, som därefter begränsar sökdjupet. Efter att ha genererat noder finner programmet lösningen 15 promenader. 8 Denna sats är viktig och innebär att man aldrig söker vidare när det inte finns någon chans att slå rekordet. Självklart kan tyckas. 9 Vi genererar de fyra dragen, som levereras i en sorterad array, med det drag som ligger närmast målet först Precis som i tidigare program anropar vi nu solve fyra gånger, men nu i en vad vi tror bättre ordning. Jämför vi detta program med djupet först för andra startkoordinater får vi för starten (0, 1) resultatet 7 promenader efter att ha undersökt 5461 noder ( noder för djupet först och med utökat villkor). Med starten ( 1, 0) undersöker vi noder för att nå resultatet 9 promenader (att jämföra med för djupet först och utökat villkor). Av dessa tester bör vi kunna sluta oss att den implementerade heuristiska metoden snabbar upp programmet. Att installera grafik Här presenterar vi ett enkelt grafiskt system, ursprungligen utvecklat för cirka 20 år sedan av Borland, tillsammans med Turbo C++ och TurboPascal. Systemet gör idag inte anspråk på att vara speciellt användbart. För den som använder C är till exempel Allegro och OpenGL betydligt kraftfullare, men för komplexa just nu. Eftersom Ansi C inte innehåller något om grafik, måste vi tillföra ett bibliotek till vårt system. Biblioteket, som kan laddas ned från hemsidan, heter libbgi.a och ska kopieras till..\codeblocks\mingw\lib. Dessutom ska filen graphics.h kopieras till..\codeblocks\mingw\include Nu över till CodeBlocks. Här ska man nu tala om för länkaren att det nya biblioteket ska användas (plus några till, som redan finns på plats). Gå till Settings->Compiler and debugger. Klicka på fliken Linker settings och lägg med hjälp Add till dessa rader i given ordning libbgi libgdi32 libcomdlg32 libuuid libole32 liboleaut32 Under fliken Toolchain executables ställ in C-compiler till mingw32-g++.exe Testa det hela genom att köra programmet test-bgidemo0.c som finns i zip-filen. Observera att jag endast testat detta under Windows XP och Windows Vista 64! För den som använder Linux och Apple har jag inte undersökt om det finns någon lösning. Håkan Strömberg 21 KTH Syd
UPPGIFT 1 TVÅPOTENSER. UPPGIFT 2 HISSEN I LUSTIGA HUSET.
UPPGIFT 1 TVÅPOTENSER. 2 ½ ¾ = 5575186299632655785383929568162090376495104 n = 142 är det minsta värde på n för vilket 2 Ò inleds med siffrorna 55. Uppgiften består i att skriva ett program som tar emot
Föreläsning 6. Rekursion och backtracking
Föreläsning 6 Rekursion och backtracking Föreläsning 6 Bredden först med hjälp av kö Lista rekursivt Tornet i Hanoi Backtracking Läsanvisningar och uppgifter Hissen i lustiga huset Huset har n antal våningar
UPPGIFT 1 V75 FIGUR 1.
UPPGIFT 1 V75 FIGUR 1. Varje lördag året om spelar tusentals svenskar på travspelet V75. Spelet går ut på att finna sju vinnande hästar i lika många lopp. Lopp 1: 5 7 Lopp 2: 1 3 5 7 8 11 Lopp 3: 2 9 Lopp
UPPGIFT 1 VÄNSKAPLIGA REKTANGLAR
UPPGIFT 1 VÄNSKAPLIGA REKTANGLAR FIGUR 1. Dessa två rektanglar är vänskapliga. Den ena har samma mätetal för arean som den andra har för omkretsen och tvärtom. Rektangeln till vänster har omkretsen 2 4
Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen
Håkan Strömberg KTH STH 1 Fråga 1. Vilken är den största respektive minsta värde variabeln SUM kan erhålla genom följande rutin? srand(time(0)); for(k=1;k
Problemlösning (3/5) Lösningar
Problemlösning (3/5) Lösningar Lösning Problemlösning 1. Ture bygger en båt (2) Antag 0 tillhör S: motsägelse för den fjärde, som i så fall talar sanning. Antag 1 tillhör S: I så fall måste det vara den
Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell www.bjornregnell.se
Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell www.bjornregnell.se Mål Så enkelt som möjligt: låg tröskel Ett riktigt programmeringsspråk: inget tak Roliga uppgifter som går
Föreläsning 6. Rekursion och backtracking
Föreläsning 6 Rekursion och backtracking Föreläsning 6 Bredden först med hjälp av kö Lista rekursivt Tornet i Hanoi Backtracking Hissen i lustiga huset Huset har n antal våningar (bottenvåningen som räknas
Arrays (indicerade variabler) Föreläsning 6
Arrays (indicerade variabler) Föreläsning 6 Dagens kluring int i; scanf("%d", &i); switch(i) case 1: printf("1"); case 2: printf("2"); case 3: printf("3"); break; case 4: printf("4"); break; case 5: printf("5");
HI1024 Programmering, grundkurs TEN
HI1024 Programmering, grundkurs TEN2 2014-10-27 KTH STH Haninge 13.15-18.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Projektdokumentation för Othello
Projektdokumentation för Gustav Fransson Nyvell gusfr229@student.liu.se Tomas Franzén tomfr819@student.liu.se 1. Inledning Vi har gjort ett -spel som går ut på att man turas om att lägga brickor på en
Funktioner. Räta linjen
Sidor i boken 14-143, 145-147 Funktioner. Räta linjen Här följer en dialog mellan studenten Tor-Björn (hädanefter kallad TB) och hans lärare i matematik Karl-Ture Hansson (nedan kallad KTH). När vi möter
3. Välj den sprajt (bild) ni vill ha som fallande objekt, t ex en tårta, Cake. Klicka därefter på OK.
Moment 2: Klonspel Instruktioner för deltagare Idag ska du få lära dig om: Kloner - kopior av samma figur (sprajt) Variabler - ett värde, exempelvis antal poäng Slumptal - slå en tärning för att välja
Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:
Föreläsning 7 Innehåll Rekursion Rekursivt tänkande: Hur många år fyller du? Ett år mer än förra året! Rekursion Rekursiv problemlösning Binärsökning Generiska metoder Rekursiv problemlösning: Dela upp
HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,
KTH STH TENTAMEN HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011, 8.15-13.15 Gamla kurskoder: HI1900, 6E2950, etc. Examinator: Johnny Panrike Rättande lärare: Nicklas Brandefelt, Johnny
Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x
Mathematica Första kapitlet kommer att handla om Mathematica det matematiska verktyg, som vi ska lära oss hantera under denna kurs. Indata När du arbetar med Mathematica ger du indata i form av kommandon
HI1024 Programmering, grundkurs TEN
HI1024 Programmering, grundkurs TEN2 2016-12-22 KTH STH Flemingsberg 8.15-13.00 Tillåtna hjälpmedel: Kursboken C PROGRAMMING A Modern Approach K. N. King helt utan anteckningar Alternativt C från början
Arrays (indicerade variabler) Föreläsning 4
Arrays (indicerade variabler) Föreläsning 4 Dagens kluring Hitta felet (ska skriva ut 10,9,8,7,6,5,4,3,2,1): int n; for(n=10;n0;n--) for(m=0;m
Uppgift 1. Kylskåpstransporter
Uppgift 1. Kylskåpstransporter 1. Här kan du se de två bilarna lastade med kylskåp på väg mot stormarknaden En fabrik som tillverkar kylskåp ska leverera ett större parti med n, 1 n 1000, kylar till en
Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001)
Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001) Skrivtid: 8:15-13:15 Datum: Måndagen 2005-03-07 Tentamen består av 7 sidor Hjälpmedel: Förutom dator med installerad Borland C++ 5.02,
Tentamen TEN1 HI
Tentamen TEN1 HI1029 2014-03-14 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha
Värmedistribution i plåt
Sid 1 (6) Värmedistribution i plåt Introduktion Om vi med konstant temperatur värmer kanterna på en jämntjock plåt så kommer värmen att sprida sig och temperaturen i plåten så småningom stabilisera sig.
Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering
Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering switch int weekday; printf("mata in veckodagnummer 1-7: "); scanf("%d", &weekday); switch(weekday)
Programmering i C, 7,5 hp
Programmering i C, 7,5 hp Föreläsning 4 VÄLKOMNA! 31 switch-satsen Antag att vi har en heltalsvariabel a som skall styra programflödet Antag vidare att a kan anta tex 5 olika värden 1,2,3,4,5 printf( Mata
Datorteknik 2 (AVR 2)
Namn: Laborationen godkänd: Digitala system 15 hp Datorteknik 2 (AVR 2) LTH Ingenjörshögskolan vid Campus Helsingborg Enkel in- och utmatning. Drivrutiner. Bithantering. I denna laboration ska vi förbättra
HI1024 Programmering, grundkurs TEN
HI1024 Programmering, grundkurs TEN2 2015-01-08 KTH STH Haninge 13.15-18.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Utförliga regler för TRAX
Utförliga regler för TRAX Innehållsförteckning Vad är TRAX? Sid 2 Grundregler för TRAX Sid 3 Vad är en tvingad yta? Sid 4 Vad är en vinnande ögla? Sid 6 Vad är en vinnande linje? Sid 7 Grundläggande strategiska
UPPGIFT 1 WILL ROGERS FENOMEN
UPPGIFT 1 WILL ROGERS FENOMEN Will Rogers (1879-1935) var en amerikansk komiker känd för bland annat följande citat: When the Okies left Oklahoma and moved to California, they raised the average intelligence
BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X
Algoritmer och Datastrukturer Kary FRÄMLING/Göran PULKKIS (v23) Kap. 7, Sid 1 BINÄRA TRÄD Träd används för att representera olika slags hierarkier som ordnats på något sätt. Den mest använda trädstrukturen
Algoritmer, datastrukturer och komplexitet
Algoritmer, datastrukturer och komplexitet Övning 6 Anton Grensjö grensjo@csc.kth.se 4 oktober 2017 1 Idag Algoritmkonstruktion (lite blandat) Redovisning och inlämning av labbteori 3 2 Uppgifter Uppgift
732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel
732G11 Linköpings universitet 2011-02-15 1 2 3 4 Extrapass Extrapass håller på att bokas. Blir 3-4 st. och öppet för alla. Mer info på kursmailen när bokningen är klar. i Java En funktion i Java... public
Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T
Algoritmer och datastrukturer H I 1 0 2 9 HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T Föreläsning 1 Inledande om algoritmer Rekursion Stacken vid rekursion Rekursion iteration Möjliga vägar
String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning
Dagens Agenda String [] argv String [] argv Arrayer och Strängar fortsättning Booleska operatorer if, for, while satser Introduktion till algoritmer public static void main(string [] argv) argv är variabelnamnet
Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen
Tentamen för teknisk kemi, 10p, moment 1 29 november 1999 Skrivtid 9-15 Hjälpmedel: av följande böcker. - U. Bilting och J. Skansholm: Vägen till C - A. Kelley & I. Pohl: A Book on C Maxpoäng: Gräns för
UPPGIFT 1 TVETYDIGA DATUM
UPPGIFT 1 TVETYDIGA DATUM Datum skrivs på olika sätt i olika länder. Till exempel skulle datumet 03/05/01 i Sverige betyda 1 maj 2003, medan det i USA skulle vara 5 mars 2001 och i en del andra länder
HI1024 Programmering, grundkurs TEN2 2014-03-13
HI1024 Programmering, grundkurs TEN2 2014-03-13 KTH STH Haninge 13.15-18.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Robotarm och algebra
Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2010-12-07 Robotarm och algebra I denna laboration skall du lära dig lite mer om möjlighetera att rita ut mer avancerade
Den räta linjens ekvation
Den räta linjens ekvation Här följer en dialog mellan studenten Tor-Björn (hädanefter kallad TB) och hans lärare i matematik Karl-Ture Hansson (nedan kallad KTH). När vi möter dem för första gången är
HI1024 Programmering, grundkurs TEN
HI1024 Programmering, grundkurs TEN2 2016-01-09 KTH STH Haninge 8.15-13.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Planering Programmering grundkurs HI1024 HT 2014
Planering Programmering grundkurs HI1024 HT 2014 Föreläsning V36 Föreläsning 1 Vad är programmering? Boken! Kurs-PM Vad är ett program? Kompilerande- Interpreterande Programmeringsmiljö Hello World! Att
UPPGIFT 2 KVADRATVANDRING
UPPGIFT 1 LYCKOTAL Lyckotal är en serie heltal, som hittas på följande sätt. Starta med de naturliga talen: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... Sök upp det första talet i serien, som är större
Sidor i boken 8-9, 90-93
Sidor i boken 8-9, 90-93 Absolutbelopp Men först lite om Absolutbelopp., kallas absolutbeloppet av, och är avståndet för till origo på tallinjen. Som bekant är avståndet till origo för talet 4, 4. Detta
Mäta rakhet Scanning med M7005
Matematikföretaget jz M7005.metem.se 141121/150411/150704/SJn Mäta rakhet Scanning med M7005 Mätgivare Detalj Mäta rakhet - Scanning 1 (12) Innehåll 1 Ett exempel... 3 2 Beskrivning... 6 2.1 Scanna in
Tentamen, EDA501/EDAA20 Programmering M MD W BK L
LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDA501/EDAA20 Programmering M MD W BK L 2017 05 31, 8.00 13.00 Anvisningar: Preliminärt ger uppgifterna 9 + 12 + 10 + 9 = 40 poäng.
Tentamen, Algoritmer och datastrukturer
UNDS TEKNISKA ÖGSKOA (6) Institutionen för datavetenskap Tentamen, Algoritmer och datastrukturer 23 8 29, 8. 3. Anvisningar: Denna tentamen består av fem uppgifter. Totalt är skrivningen på 36 poäng och
Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.
Tentamen Programmeringsteknik II 2014-0-27 Skrivtid: 0800 100 Tänk på följande Skriv läsligt! Använd inte rödpenna! Skriv bara på framsidan av varje papper. Börja alltid ny uppgift på nytt papper. Lägg
Datastrukturer och Algoritmer D0041D
Luleå Tekniska Universitet 19 mars 2014 Laborationsrapport Laboration 3 Datastrukturer och Algoritmer D0041D Primms Algoritm Namn E-mail Magnus Björk magbjr-3@ltu.student.se Handledare Felix Hansson Primms
1, 2, 3, 4, 5, 6,...
Dagens nyhet handlar om talföljder, ändliga och oändliga. Talföljden 1,, 3, 4, 5, 6,... är det första vi, som barn, lär oss om matematik över huvud taget. Så småningom lär vi oss att denna talföljd inte
Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001)
Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001) Skrivtid: 8:15-13:15 Datum: Torsdagen 2003-08-21 Tentamen består av 4 sidor Hjälpmedel: Förutom dator med installerad Borland C++ 5.02
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära
Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:
Länkade listor i C Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till: Dynamiskt allokerad array Arrayer allokerade på stacken Kan alltså användas till att
Algoritmer, datastrukturer och komplexitet
Algoritmer, datastrukturer och komplexitet Övning 6 Anton Grensjö grensjo@csc.kth.se 9 oktober 2015 Anton Grensjö ADK Övning 6 9 oktober 2015 1 / 23 Översikt Kursplanering Ö5: Grafalgoritmer och undre
HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,
KTH STH TENTAMEN HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011, 8.15-12.15 Gamla kurskoder: HI1900, 6E2950, etc. Examinator: Johnny Panrike Rättande lärare: Nicklas Brandefelt, Johnny
Den räta linjens ekvation
Den räta linjens ekvation Här följer en dialog mellan studenten Tor-Björn (hädanefter kallad TB) och hans lärare i matematik Karl-Ture Hansson (nedan kallad KTH). När vi möter dem för första gången är
Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.
Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis
Varför behövs det? I Allegro finns t.ex. stöd för:
Allegro Introduktion Översikt vad är Allegro? Vad är lib och h-fil Kolla kodexempel Strukturen på ett Allegrospel Hur kommer jag igång? Var kan jag läsa mer Addons Alternativ Vad är Allegro? Ett spelprogrammeringsbibliotek
Kravspecifikation. Sammanfattning. Fyra i rad Javaprojekt inom TDDC32. Version 2.0. Datum Dokumentnummer
Kravspecifikation Fyra i rad Javaprojekt inom TDDC32 Version 2.0 Datum 2008-05-19 Dokumentnummer 20080215 Sammanfattning Detta är en kravspecifikation över det klassiska spelet Fyra-i-rad programmerat
Belopp Belopp > procent
Dagens problem Försäljarprovision Lönen för en försäljare är helt grundad på provision, direkt kopplad till den omsättning han lyckas skapa under en månad. Tabellen nedan anger procentsatser för olika
Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6
Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6? DAGENS AGENDA Komplexitet Ordobegreppet Komplexitetsklasser Loopar Datastrukturer Några nyttiga regler OBS! Idag jobbar
Programmering. Scratch - grundövningar
Programmering Scratch - grundövningar Lär känna programmet: Menyer för att växla mellan att arbeta med script, utseende/bakgrund och ljud. Scenen där allting utspelar sig. Här klickar du på bakgrunden
Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.
Sphero SPRK+ Appen som används är Sphero Edu När appen öppnas kommer man till denna bild. Klicka på 3D-modeller för att se delarna på Sphero Klicka här för att ansluta Sphero till ipad Programmet för att
Grundritning Torpargrund
Grundritning Torpargrund Ritningsnummer Grundritning... 2 Startfil för Grundritning... 3 Inställning för Grundritning... 4 Rita rektangulär torpargrund baserad på två punkter... 6 Fri Yttermur/Hjärtmur...
DD1361 Programmeringsparadigm. Carina Edlund
DD1361 Programmeringsparadigm Carina Edlund carina@nada.kth.se Funktionell programmering Grundidéen med funktionell programmering är att härma matematiken och dess funktionsbegrepp. Matematiskt funktionsbegrepp
Uppgifter till praktiska tentan, del A. (7 / 27)
Uppgifter till praktiska tentan, del A. (7 / 27) I. Sortering/Sökning: III II. Representation/Omvandling/format/protokoll: II III. Strukturering: II I alla problem, där bokstäver förekommer, antar vi att
Loopar och datatyper. Föreläsning 3
Loopar och datatyper Föreläsning 3 Dagens kluringar int x; printf("ange x:"); scanf("%d",&x); if(/*fyll i kod*/) printf("du angav x mellan 7 och 14"); int i=0; if(i++) i++; printf("%d",i++); //vad skrivs
Att skapa en bakgrundsbild och använda den i HIPP
Att skapa en bakgrundsbild och använda den i HIPP Bakgrundsbilder i HIPP kan användas till olika saker, t ex som ett rutnät för en tabell eller en grundkarta. Här visas hur man gör en grundkarta som en
Trepoängsproblem. Kängurutävlingen 2012 Junior
Trepoängsproblem 1. M och N är mittpunkterna på de lika långa sidorna i en likbent triangel. Hur stor är arean av fyrhörningen markerad med X? : 3 : 4 C: 5 D: 6 E: 7 M? X 3 3 6 N 2. När lice skickar ett
a = a a a a a a ± ± ± ±500
4.1 Felanalys Vill man hårddra det hela, kan man påstå att det inte finns några tal i den tillämpade matematiken, bara intervall. Man anger till exempel inte ett uppmätt värde till 134.78 meter utan att
Uppgift 1 (grundläggande konstruktioner)
Uppgift 1 (grundläggande konstruktioner) a) Skriv ett program som låter användaren mata in 7 heltal och som gör utskrifter enligt nedanstående körexempel. Mata in 7 heltal: 1 0 0 3 1 1 1 Tal nr 2 var en
JavaScript del 3 If, Operatorer och Confirm
JavaScript del 3 If, Operatorer och Confirm Under förra uppgiften så kollade vi på hur användaren kan ge oss information via promt(), vi använde den informationen både för att skriva ut den och för att
SPRINT-HANDBOK (version 0.4)
1. FÄRG OCH FORM Detta är programmets startmeny. Texten överst på bilden (Avsluta, Ny användare, Om... och Välj användare) blir synlig då markören förs upp den blåa ramen. en ny användare. 6. 4. 5. får
Loopar och datatyper. Föreläsning 3
Loopar och datatyper Föreläsning 3 Dagens kluringar int x; printf("ange x:"); scanf("%d",&x); if(/*fyll i kod*/) printf("du angav x mellan 7 och 14"); int i=0; if(i++) i++; printf("%d",i++); //vad skrivs
En kort text om programmering i C.
En kort text om programmering i C C skapades 1972 av Brian Ritchie och Dennis Kerighan på Bell Labs i USA Det blev det språk som är mest använt genom tiderna Det finns många olika språk Pascal, FORTH,
Tentamen TEN1 HI1029 2014-05-22
Tentamen TEN1 HI1029 2014-05-22 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha
TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15. Tisdagen 26 april Tentamen består av 8 sidor
TENTAMEN Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15 Tisdagen 26 april 2011 Tentamen består av 8 sidor Hjälpmedel Förutom dator med installerad Code::Blocks, Utforskaren, Acrobat reader och Notepad
Mikael Bondestam Johan Isaksson. Spelprogrammering. med CDX och OpenGL
Mikael Bondestam Johan Isaksson Spelprogrammering med CDX och OpenGL Del 2 Spel Historiskt spel... 36 7. Studsboll en sprite...37 8. Styrning med tangentbordet... 48 9. Krockar...51 10. Ljudeffekter...
DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18
KTH, Nada, Alexander Baltatzis DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18 Maxpoäng 100p, godkänt 50p. Bonus max 10p adderas. Resultatet anslås på mina
Uppgift 1 ( Betyg 3 uppgift )
2008-03-12.kl.14-19 Uppgift 1 ( Betyg 3 uppgift ) Du skall skriva ett program som läser igenom en textfil som heter FIL.TXT och skriver ut alla rader där det står ett decimaltal först på raden. Decimaltal
i LabVIEW. Några programmeringstekniska grundbegrepp
Institutionen för elektroteknik Några programmeringstekniska grundbegrepp 1999-02-16 Inledning Inom datorprogrammering förekommer ett antal grundbegrepp som är i stort sett likadana oberoende om vi talar
Talmängder. Målet med första föreläsningen:
Moment 1..1, 1.., 1..4, 1..5, 1.. 1..5, 1..6 Viktiga exempel 1.7, 1.8, 1.8,1.19,1. Handräkning 1.7, 1.9, 1.19, 1.4, 1.9 b,e 1.0 a,b Datorräkning 1.6-1.1 Målet med första föreläsningen: 1 En första kontakt
Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.
5(16) Tentamen på kurserna Programmeringsteknik med C och Matlab Programmering i C Tid: 2/11-11, kl. 9-13 Lärare: Jonny Pettersson Totalt: 60 poäng Betyg 3: 30 poäng Betyg 4: 39 poäng Betyg 5: 48 poäng
Dekomposition och dynamisk programmering
Algoritmer, datastrukturer och komplexitet, hösten 2016 Uppgifter till övning 3 Dekomposition och dynamisk programmering Max och min med dekomposition I vektorn v[1..n] ligger n tal. Konstruera en dekompositionsalgoritm
Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö Kö (ADT) En kö fungerar som en kö. Man fyller på den längst bak och tömmer den längst fram
Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret 2014-2015. Lektion 4
Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret 014-015 Denna lektion ska vi studera rekursion. Lektion 4 Principen om induktion Principen om induktion är ett vanligt sätt att bevisa
Arduinokurs. Kurstillfälle 4
Kurstillfälle 4 CW-generering Det här kan ses som överkurs men kan ändå vara roligt för att kunna generera CW på ett enkelt sätt. Det blir en hel del nytt men vi tar det steg för steg Som alla vet gäller
Programmeringsolympiaden 2018
Programmeringsolympiaden 2018 TÄVLINGSREGLER FÖR SKOLKVALET Tävlingen äger rum på av skolan bestämt datum under fyra timmar. Ingen förlängning ges för lunch eller raster. Eleven ska i förväg komma överens
TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET
UMEÅ UNIVERSITET Datavetenskap 010824 TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET Datum : 010824 Tid : 9-15 Hjälpmedel : Inga Antal uppgifter : 7 Totalpoäng : 40 (halva poängtalet krävs normalt
3, 6, 9, 12, 15, 18. 1, 2, 4, 8, 16, 32 Nu är stunden inne, då vill vill summera talen i en talföljd
I föreläsning 18 bekantade vi oss med talföljder, till exempel eller 3, 6, 9, 1, 15, 18 1,, 4, 8, 16, 3 Nu är stunden inne, då vill vill summera talen i en talföljd och 3 + 6 + 9 + 1 + 15 + 18 1 + + 4
Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.1, 4.3, 4.4, 4.5, 4.6, 4.13, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4.3, 4.4, 4.5, 4.
Moment 4.2.1, 4.2.2, 4.2., 4.2.4 Viktiga exempel 4.1, 4., 4.4, 4.5, 4.6, 4.1, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4., 4.4, 4.5, 4.7 Många av de objekt man arbetar med i matematiken och naturvetenskapen
C++ Slumptalsfunktioner + switch-satsen
C++ Slumptalsfunktioner + switch-satsen Veckans avsnitt består av ett antal lite udda funktioner man kan ha nytta av när man skriver program. Det är en slumptalsgenerator och lite annat smått och gott.
HI1024 Programmering, grundkurs TEN2 2015-10-30
HI1024 Programmering, grundkurs TEN2 2015-10-30 KTH STH Haninge 8.15-13.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King
Uppgift 1a (Aktiekurser utan poster)
Uppgift 1a (Aktiekurser utan poster) Vi har lite olika upplägg i de kurser vi håller och i vissa kurser finns det med något som vi kallar "poster" (eng. "record"). I andra har vi inte med detta. Vi har
Programmeringsteknik med C och Matlab
Programmeringsteknik med C och Matlab Kapitel 2: C-programmeringens grunder Henrik Björklund Umeå universitet Björklund (UmU) Programmeringsteknik 1 / 32 Mer organisatoriskt Imorgon: Datorintro i lab Logga
Labora&on 2 Funk&oner, if och loop övningar/uppgi:er
Labora&on 2 Funk&oner, if och loop övningar/uppgi:er 1M322 Webbteknik 2, 7,5hp Medieteknik 2017 Rune Körnefors rune.kornefors@lnu.se 1. Ladda ner arbetsdokument Till övningarna i denna labora&on finns
Övning från förra gången: readword
(9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver
Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser
Föreläsning 5-6 Innehåll Exempel på program med objekt Skapa och använda objekt Skriva egna klasser public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600,
Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs 2007 www.hh.se/staff/vero/programmering. Verónica Gaspes. IDE-sektionen.
Programmering Sommarkurs 2007 www.hh.se/staff/vero/programmering Verónica Gaspes IDE-sektionen Juni 14 Utkast 1 Recap 2 Mera om nya typer 3 Kort 4 Fält Recap Man kan ge namn till typer. Vi undersökte enum
Lab5 för prgmedcl04 Grafik
Lab5 för prgmedcl04 Grafik Viktigt läs detta först:den här labblydelsen är ganska lång, detta betyder inte att labben tar lång tid.en hel del av lydelsen är anvisning om hur man går tillväga för att kunna
1,3,5,7,9,...,99. Skriv ett program som genererar en multiplikationstabell med följande utseende
Arraymotion Skriv ett program som fyller en array med talen 1,3,5,7,9,...,99 och därefter skriver ut dem början på 99. Antal lika Skriv ett program som fyller två vektorer (arrayer) a och b med 100 slumptal
Lösningar Datastrukturer TDA
Lösningar Datastrukturer TDA416 2016 12 21 roblem 1. roblem 2. a) Falskt. Urvalssortering gör alltid samma mängd av jobb. b) Sant. Genom att ha en referens till sista och första elementet, kan man nå både