Pascal

Moderators: None (Apply to moderate this forum)
Number of threads: 4106
Number of posts: 14016

This Forum Only
Post New Thread
Single Post View       Linear View       Threaded View      f

Report
Sudoku solving program problems Posted by Swith on 30 Aug 2012 at 2:54 PM
I was trying to write a program that would solve sudokus, and as far as I can tell what I have done should work. It presents no error messages, but if you enter a valid sudoku puzzle, it does nothing at all and accepts no further input. The only thing that it does strangely is if you enter a solved sudoku, the final line that it prints after it thinks it has solved it is a row of zeros. Any help would be greatly appreciated!

program sudoku;

var
   input : array[1..9, 1..9] of integer;
   cell : array[1..9, 1..9, 1..9] of integer;
   output : array[1..9, 1..9] of integer;
   cposs : array[1..9, 1..9,  1..9] of integer;
   cloop, cloop2, rloop, rloop2, bloop, bloop2, loop, loop2, loop3, c, d : integer;
   cloop3, rloop3, bloop3 : integer;
   cloop4, rloop4, bloop4 : integer;
   cloop5, rloop5, bloop5 : integer;
   solved : boolean;

begin



     {sets all items of input array to 0}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do

                input[loop2,loop] := 0;
       end;

     {sets all items of cell array to 10}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do
              begin

                   for loop3 := 1 to 9 do
                   begin

                        cell[loop3,loop2,loop] := 10;
                   end;
              end;
       end;

     {instructions}
     writeln('== Sudoku Solver ==':50);
     writeln;
     writeln;
     writeln('Please enter the numbers of your sudoku from left to right, one row at a time from top to bottom, WITH A SPACE BETWEEN EACH CHARACTER, pressing enter after each row. If the cell is empty, please write a 0.');
     writeln;

     {reading inputs}
     for rloop := 1 to 9 do

       begin

          for cloop := 1 to 9 do

               read( input[cloop,rloop] );
       end;

     {copies inputs to "cell" array, and adds box position}
     for rloop := 1 to 9 do
         begin

            for cloop := 1 to 9 do
                begin

                   if cloop in [1..3] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,1] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,4] := input[cloop,rloop] else

                            if rloop in [7..8] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                   if cloop in [4..6] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,2] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,5] := input[cloop,rloop] else

                            if rloop in [7..8] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                   if cloop in [7..9] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,3] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,6] := input[cloop,rloop] else

                            if rloop in [7..8] then
                              cell[cloop,rloop,9] := input[cloop,rloop];
                end;
         end;


     repeat


     c := 0;
     d := 0;

     {the big block}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 {checks if it is possible to have cell in that box
                  by checking if a value from input has been copied
                  over (the value wont be 10}
                  if cell[cloop,rloop,bloop] < 10 then
                  begin
                    if cell[cloop,rloop,bloop] > 0 then
                    begin

                      {no possibility for that number in the cells in this box}
                      for bloop2 := 1 to 9 do
                        begin

                          for rloop2 := 1 to 9 do
                            begin
                              for cloop2 := 1 to 9 do
                                begin
                                  if cell[cloop2,rloop2,bloop2] < 10 then
                                    begin
                                      if bloop2 = bloop then
                                        cposs[cloop2, rloop2, cell[cloop,rloop,bloop] ] := 1;
                                    end;
                                end;
                            end;
                        end;

                          {no possibility for that number in the cells in that row}
                          for bloop3 := 1 to 9 do
                            begin
                              for rloop3 := 1 to 9 do
                                begin
                                  for cloop3 := 1 to 9 do
                                    begin
                                      if cell[cloop3,rloop3,bloop3] < 10 then
                                        begin
                                          if rloop3 = rloop then
                                            cposs[cloop3, rloop3, cell[cloop,rloop,bloop] ] := 1;
                                        end;
                                    end;
                                end;
                            end;

                            {no possibility for that number in the cells in that column}
                            for bloop4 := 1 to 9 do
                              begin
                                for rloop4 := 1 to 9 do
                                  begin
                                    for cloop4 := 1 to 9 do
                                      begin
                                        if cell[cloop4,rloop4,bloop4] < 10 then
                                          begin
                                            if cloop4 = cloop then
                                              cposs[cloop4, rloop4, cell[cloop,rloop,bloop] ] := 1;
                                          end;
                                      end;
                                  end;
                              end;

                    end;

                  end;

                  {checks if cell has only one possible answer}
                  for loop := 1 to 9 do
                    begin
                         if cposs[cloop,rloop,loop] = 0 then
                            c := c + 1;
                    end;
                  if c = 1 then
                    begin
                         for loop := 1 to 9 do
                           begin
                           if cposs[cloop, rloop, loop] = 0 then
                             cell[cloop,rloop,bloop] := loop;
                           end;
                    end;

               end;
           end;
       end;
     {checks if sudoku is finished}
     for bloop5 := 1 to 9 do
       begin
         for rloop5 := 1 to 9 do
           begin
             for cloop5 := 1 to 9 do
               begin
                 if cell[cloop5, rloop5, bloop5] = 0 then
                   d := d + 1;
               end;
           end;
       end;
     if d = 0 then solved := true;

     until solved = true;

     {copying}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 if cell[cloop,rloop,bloop] < 10 then
                   begin

                     output[cloop,rloop] := cell[cloop,rloop,bloop];
                   end;
               end;
           end;
       end;

     writeln;

     {printing}
     for rloop := 1 to 9 do
       begin

         for cloop := 1 to 9 do
           begin

             write(output[cloop,rloop],' ');
           end;
         writeln;

       end;
     writeln;
     writeln('Solved!');
     readln;
     readln;

end.

Report
Re: Sudoku solving program problems Posted by quikcarlx on 31 Aug 2012 at 12:58 PM
Looks fine except for some testing that you have. And why all the Begin .. end statements in loops that only have one statement. Just a lot of extra writing on your part.
I think you need to change these:
                           if rloop in [7..8] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                           if rloop in [7..9] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                            if rloop in [7..8] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                            if rloop in [7..9] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                            if rloop in [7..8] then
                              cell[cloop,rloop,9] := input[cloop,rloop];

                            if rloop in [7..9] then
                              cell[cloop,rloop,9] := input[cloop,rloop];

I have another program that I found on a european site that I altered for doing sudoku puzzles on screen.
Report
Re: Sudoku solving program problems Posted by quikcarlx on 31 Aug 2012 at 1:06 PM
Looks fine except for some testing that you have. And why all the Begin .. end statements in loops that only have one statement. Just a lot of extra writing on your part.
I think you need to change these:
                           if rloop in [7..8] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                           if rloop in [7..9] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                            if rloop in [7..8] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                            if rloop in [7..9] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                            if rloop in [7..8] then
                              cell[cloop,rloop,9] := input[cloop,rloop];

                            if rloop in [7..9] then
                              cell[cloop,rloop,9] := input[cloop,rloop];

I have another program that I found on a european site that I altered for doing sudoku puzzles on screen.
Report
Re: Sudoku solving program problems Posted by Swith on 2 Sept 2012 at 8:10 AM
You're absolutely right about needing to change those, and doing so does stop the row of zeroes appearing when I enter a solved sudoku, but the program still doesn't solve an unsolved sudoku; it refuses input after you enter the final line, suggesting that it is stuck in a loop. Any ideas why?
Report
Re: Sudoku solving program problems Posted by Swith on 2 Sept 2012 at 8:12 AM
You're absolutely right about needing to change those, and doing so does stop the row of zeroes appearing when I enter a solved sudoku, but the program still doesn't solve an unsolved sudoku; it refuses input after you enter the final line, suggesting that it is stuck in a loop. Any ideas why?

program sudoku;

var
   input : array[1..9, 1..9] of integer;
   cell : array[1..9, 1..9, 1..9] of integer;
   output : array[1..9, 1..9] of integer;
   cposs : array[1..9, 1..9,  1..9] of integer;
   cloop, cloop2, rloop, rloop2, bloop, bloop2, loop, loop2, loop3, c, d : integer;
   cloop3, rloop3, bloop3 : integer;
   cloop4, rloop4, bloop4 : integer;
   cloop5, rloop5, bloop5 : integer;
   solved : boolean;

begin



     {sets all items of input array to 0}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do

                input[loop2,loop] := 0;
       end;

     {sets all items of cell array to 10}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do
              begin

                   for loop3 := 1 to 9 do
                   begin

                        cell[loop3,loop2,loop] := 10;
                   end;
              end;
       end;

     {instructions}
     writeln('== Sudoku Solver ==':50);
     writeln;
     writeln;
     writeln('Please enter the numbers of your sudoku from left to right, one row at a time from top to bottom, WITH A SPACE BETWEEN EACH CHARACTER, pressing enter after each row. If the cell is empty, please write a 0.');
     writeln;

     {reading inputs}
     for rloop := 1 to 9 do

       begin

          for cloop := 1 to 9 do

               read( input[cloop,rloop] );
       end;

     {copies inputs to "cell" array, and adds box position}
     for rloop := 1 to 9 do
         begin

            for cloop := 1 to 9 do
                begin

                   if cloop in [1..3] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,1] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,4] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                   if cloop in [4..6] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,2] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,5] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                   if cloop in [7..9] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,3] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,6] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,9] := input[cloop,rloop];
                end;
         end;


     repeat


     c := 0;
     d := 0;

     {the big block}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 {checks if it is possible to have cell in that box
                  by checking if a value from input has been copied
                  over (the value wont be 10}
                  if cell[cloop,rloop,bloop] < 10 then
                  begin
                    if cell[cloop,rloop,bloop] > 0 then
                    begin

                      {no possibility for that number in the cells in this box}
                      for bloop2 := 1 to 9 do
                        begin

                          for rloop2 := 1 to 9 do
                            begin
                              for cloop2 := 1 to 9 do
                                begin
                                  if cell[cloop2,rloop2,bloop2] < 10 then
                                    begin
                                      if bloop2 = bloop then
                                        cposs[cloop2, rloop2, cell[cloop,rloop,bloop] ] := 1;
                                    end;
                                end;
                            end;
                        end;

                          {no possibility for that number in the cells in that row}
                          for bloop3 := 1 to 9 do
                            begin
                              for rloop3 := 1 to 9 do
                                begin
                                  for cloop3 := 1 to 9 do
                                    begin
                                      if cell[cloop3,rloop3,bloop3] < 10 then
                                        begin
                                          if rloop3 = rloop then
                                            cposs[cloop3, rloop3, cell[cloop,rloop,bloop] ] := 1;
                                        end;
                                    end;
                                end;
                            end;

                            {no possibility for that number in the cells in that column}
                            for bloop4 := 1 to 9 do
                              begin
                                for rloop4 := 1 to 9 do
                                  begin
                                    for cloop4 := 1 to 9 do
                                      begin
                                        if cell[cloop4,rloop4,bloop4] < 10 then
                                          begin
                                            if cloop4 = cloop then
                                              cposs[cloop4, rloop4, cell[cloop,rloop,bloop] ] := 1;
                                          end;
                                      end;
                                  end;
                              end;

                    end;

                  end;

                  {checks if cell has only one possible answer}
                  for loop := 1 to 9 do
                    begin
                         if cposs[cloop,rloop,loop] = 0 then
                            c := c + 1;
                    end;
                  if c = 1 then
                    begin
                         for loop := 1 to 9 do
                           begin
                           if cposs[cloop, rloop, loop] = 0 then
                             cell[cloop,rloop,bloop] := loop;
                           end;
                    end;

               end;
           end;
       end;
     {checks if sudoku is finished}
     for bloop5 := 1 to 9 do
       begin
         for rloop5 := 1 to 9 do
           begin
             for cloop5 := 1 to 9 do
               begin
                 if cell[cloop5, rloop5, bloop5] = 0 then
                   d := d + 1;
               end;
           end;
       end;
     if d = 0 then solved := true;

     until solved = true;

     {copying}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 if cell[cloop,rloop,bloop] < 10 then
                   begin

                     output[cloop,rloop] := cell[cloop,rloop,bloop];
                   end;
               end;
           end;
       end;

     writeln;

     {printing}
     for rloop := 1 to 9 do
       begin

         for cloop := 1 to 9 do
           begin

             write(output[cloop,rloop],' ');
           end;
         writeln;

       end;
     writeln;
     writeln('Solved!');
     readln;
     readln;

end.

Report
Re: Sudoku solving program problems Posted by Swith on 2 Sept 2012 at 8:15 AM
You're absolutely right about needing to change those, and doing so does stop the row of zeroes appearing when I enter a solved sudoku, but the program still doesn't solve an unsolved sudoku; it refuses input after you enter the final line, suggesting that it is stuck in a loop. Any ideas why?

program sudoku;

var
   input : array[1..9, 1..9] of integer;
   cell : array[1..9, 1..9, 1..9] of integer;
   output : array[1..9, 1..9] of integer;
   cposs : array[1..9, 1..9,  1..9] of integer;
   cloop, cloop2, rloop, rloop2, bloop, bloop2, loop, loop2, loop3, c, d : integer;
   cloop3, rloop3, bloop3 : integer;
   cloop4, rloop4, bloop4 : integer;
   cloop5, rloop5, bloop5 : integer;
   solved : boolean;

begin



     {sets all items of input array to 0}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do

                input[loop2,loop] := 0;
       end;

     {sets all items of cell array to 10}
     for loop := 1 to 9 do
       begin

            for loop2 := 1 to 9 do
              begin

                   for loop3 := 1 to 9 do
                   begin

                        cell[loop3,loop2,loop] := 10;
                   end;
              end;
       end;

     {instructions}
     writeln('== Sudoku Solver ==':50);
     writeln;
     writeln;
     writeln('Please enter the numbers of your sudoku from left to right, one row at a time from top to bottom, WITH A SPACE BETWEEN EACH CHARACTER, pressing enter after each row. If the cell is empty, please write a 0.');
     writeln;

     {reading inputs}
     for rloop := 1 to 9 do

       begin

          for cloop := 1 to 9 do

               read( input[cloop,rloop] );
       end;

     {copies inputs to "cell" array, and adds box position}
     for rloop := 1 to 9 do
         begin

            for cloop := 1 to 9 do
                begin

                   if cloop in [1..3] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,1] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,4] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,7] := input[cloop,rloop];


                   if cloop in [4..6] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,2] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,5] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,8] := input[cloop,rloop];

                   if cloop in [7..9] then
                            if rloop in [1..3] then
                              cell[cloop,rloop,3] := input[cloop,rloop] else

                            if rloop in [4..6] then
                              cell[cloop,rloop,6] := input[cloop,rloop] else

                            if rloop in [7..9] then
                              cell[cloop,rloop,9] := input[cloop,rloop];
                end;
         end;


     repeat


     c := 0;
     d := 0;

     {the big block}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 {checks if it is possible to have cell in that box
                  by checking if a value from input has been copied
                  over (the value wont be 10}
                  if cell[cloop,rloop,bloop] < 10 then
                  begin
                    if cell[cloop,rloop,bloop] > 0 then
                    begin

                      {no possibility for that number in the cells in this box}
                      for bloop2 := 1 to 9 do
                        begin

                          for rloop2 := 1 to 9 do
                            begin
                              for cloop2 := 1 to 9 do
                                begin
                                  if cell[cloop2,rloop2,bloop2] < 10 then
                                    begin
                                      if bloop2 = bloop then
                                        cposs[cloop2, rloop2, cell[cloop,rloop,bloop] ] := 1;
                                    end;
                                end;
                            end;
                        end;

                          {no possibility for that number in the cells in that row}
                          for bloop3 := 1 to 9 do
                            begin
                              for rloop3 := 1 to 9 do
                                begin
                                  for cloop3 := 1 to 9 do
                                    begin
                                      if cell[cloop3,rloop3,bloop3] < 10 then
                                        begin
                                          if rloop3 = rloop then
                                            cposs[cloop3, rloop3, cell[cloop,rloop,bloop] ] := 1;
                                        end;
                                    end;
                                end;
                            end;

                            {no possibility for that number in the cells in that column}
                            for bloop4 := 1 to 9 do
                              begin
                                for rloop4 := 1 to 9 do
                                  begin
                                    for cloop4 := 1 to 9 do
                                      begin
                                        if cell[cloop4,rloop4,bloop4] < 10 then
                                          begin
                                            if cloop4 = cloop then
                                              cposs[cloop4, rloop4, cell[cloop,rloop,bloop] ] := 1;
                                          end;
                                      end;
                                  end;
                              end;

                    end;

                  end;

                  {checks if cell has only one possible answer}
                  for loop := 1 to 9 do
                    begin
                         if cposs[cloop,rloop,loop] = 0 then
                            c := c + 1;
                    end;
                  if c = 1 then
                    begin
                         for loop := 1 to 9 do
                           begin
                           if cposs[cloop, rloop, loop] = 0 then
                             cell[cloop,rloop,bloop] := loop;
                           end;
                    end;

               end;
           end;
       end;
     {checks if sudoku is finished}
     for bloop5 := 1 to 9 do
       begin
         for rloop5 := 1 to 9 do
           begin
             for cloop5 := 1 to 9 do
               begin
                 if cell[cloop5, rloop5, bloop5] = 0 then
                   d := d + 1;
               end;
           end;
       end;
     if d = 0 then solved := true;

     until solved = true;

     {copying}
     for bloop := 1 to 9 do
       begin

         for rloop := 1 to 9 do
           begin

             for cloop := 1 to 9 do
               begin

                 if cell[cloop,rloop,bloop] < 10 then
                   begin

                     output[cloop,rloop] := cell[cloop,rloop,bloop];
                   end;
               end;
           end;
       end;

     writeln;

     {printing}
     for rloop := 1 to 9 do
       begin

         for cloop := 1 to 9 do
           begin

             write(output[cloop,rloop],' ');
           end;
         writeln;

       end;
     writeln;
     writeln('Solved!');
     readln;
     readln;

end.

Report
Re: Sudoku solving program problems Posted by quikcarlx on 3 Sept 2012 at 6:24 PM
Okay, the obvious problems has been taken care of. Now for the difficult. I use Free Pascal Compiler 2.6.0, http://www.freepascal.org, with the IDE. It has Debug and works quite well if you take the time to check out the features. So, set up your variables to watch, step through the program to see what's going on with each statement. If you're like me, you'll have an intuitive feel what it should be doing and what the variables should be. I've done this with many programs to discover my blunders and misthoughts. Debug can really find those problems that you thought weren't happenning.



 

Recent Jobs

Official Programmer's Heaven Blogs
Web Hosting | Browser and Social Games | Gadgets

Popular resources on Programmersheaven.com
Assembly | Basic | C | C# | C++ | Delphi | Flash | Java | JavaScript | Pascal | Perl | PHP | Python | Ruby | Visual Basic
© Copyright 2011 Programmersheaven.com - All rights reserved.
Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
Operated by CommunityHeaven, a BootstrapLabs company.