commit cf4eadac9070b20874122d20d8dccd8dde47552c Author: Gregory Campbell Date: Thu Jul 8 21:23:56 2021 -0400 Initial commit diff --git a/knightstour.adb b/knightstour.adb new file mode 100755 index 0000000..5549ad8 --- /dev/null +++ b/knightstour.adb @@ -0,0 +1,123 @@ +with Ada.Text_IO; use Ada.Text_IO; +with ada.Integer_Text_IO; use Ada.Integer_Text_IO; +with ada.Float_Text_IO; use ada.Float_Text_IO; +procedure knightstour is + --Initiate a 2d array with an unknown subrange and other more simple variables + type board is array (natural range <>, natural range <>) of integer; + -- arrays a and b are all 8 (x,y) movements a knight can make + a: array (1..8) of integer := (2,1,-1,-2,-2,-1,1,2); + b: array (1..8) of integer := (1,2,2,1,-1,-2,-2,-1); + size : integer := 5; + n : integer := 1; + xpos, ypos : integer; + q : boolean; + + --Recursive procedure that does the solving portion of the algorithm + procedure try(i, x, y: in integer; q: out boolean; h: in out board) is + k, u, v : integer; + q1 : boolean; + begin + + k := 0; + + --Loops until all knights movement(k) kas been attempted or a knights move works + --Loop calls the try procedure resulting in the recursive part of this algorithm + loop + + k := k+1; + q1 := false; + u := x+(a(k)); + v := y+(b(k)); + + --Checks if u and v are within the size of the chess board + if (u in 1..size) and (v in 1..size) then + if h(u,v) = 0 then + h(u,v) := i; + --If the number of calls to try is less than all board spaces + --the try procedure is called again + if i < n then + try(i+1,u,v,q1,h); + if not q1 then + h(u,v) := 0; + end if; + else + q1 := true; + end if; + + end if; + + end if; + + exit when q1 or k=8; + end loop; + q := q1; + end try; + + --Procedure that draws out the board after calling the try procedure + procedure makeBoard(size, xpos, ypos: in out integer) is + --Given the input provided by the user a 2d array the + --length and width of the chess board is created + h : board(1..size, 1..size); + outfp : file_type; + two: integer := 2; + begin + + create(outfp, out_file, "tour.txt"); + + --Board array is filled with 0's + for i in 1..size loop + for j in 1..size loop + h(i,j) := 0; + end loop; + end loop; + + --try procedure is called and starting position is set in board array + h(xpos,ypos) := 1; + try(two, xpos, ypos, q, h); + + --After the try procedure is finished running, it is checked if the board array + --has any zeros, if it does this means the algorithm didn't work correctly + for i in 1..size loop + for j in 1..size loop + if h(i,j) = 0 then + q := false; + end if; + end loop; + end loop; + + --If the knights tour is possible the entire board is printed out with all steps + --If not "No solution" is printed out instead + if q then + for i in 1..size loop + for j in 1..size loop + put(h(i,j)); + put(outfp, h(i,j)); + end loop; + new_line; + end loop; + end if; + + if not q then + put_line("No Solution. :("); + put(outfp, "No Solution. :("); + end if; + + close(outfp); + + end makeBoard; + +--Starting procedure +begin + + --Asks for and receives input to figure out the size of the chess board + --and the starting position of the knight + --Also calls the makeboard procedure + Put("Input size of chess board (Between 5 - 10) :"); + Get(size); + Put("Start Position: x y "); + Get(xpos); + Get(ypos); + n := size*size; + makeBoard(size, xpos, ypos); + +end knightstour; diff --git a/makefile b/makefile new file mode 100644 index 0000000..79029d3 --- /dev/null +++ b/makefile @@ -0,0 +1,5 @@ +main: knightstour.adb + gnatmake knightstour.adb + +clean: + rm knightstour knightstour.ali knightstour.o tour.txt \ No newline at end of file