pygmalion 2 Junior Poster in Training

hi

i've been trying to program a solution for the knight's tour problem. i wanted to use recursive backtracking in order to accomplish this.
this is what i have so far. i keep getting stack overflows, but debugging doesn't really help or is quite complicated in some cases.
i'd appreciate any help.

public partial class KnightsTourProblemForm : Form
    {
        private const int BOARDSIDE = 8;
        private int[,] board = new int[BOARDSIDE, BOARDSIDE];

        public KnightsTourProblemForm()
        {
            InitializeComponent();
        }

        private bool CheckPosition(int row, int column)
        {
            return (row >= 0 && row < BOARDSIDE && column >= 0 && column < BOARDSIDE);
        }

        private void StepBack(ref int row, ref int column)
        {
            board[row, column] = 0;
            switch (board[row,column])
            {
                case 1:
                    row--;
                    column -= 2;
                    break;
                case 2:
                    row -= 2;
                    column--;
                    break;
                case 3:
                    row -= 2;
                    column++;
                    break;
                case 4:
                    row--;
                    column += 2;
                    break;
                case 5:
                    row++;
                    column += 2;
                    break;
                case 6:
                    row += 2;
                    column++;
                    break;
                case 7:
                    row += 2;
                    column--;
                    break;
                case 8:
                    row++;
                    column -= 2;
                    break;
            }
        }

        private void DisplayBoard(int[,] board)
        {
            boardLabel.Text = "";
            for (int i = 0; i < BOARDSIDE; i++)
            {
                for (int j = 0; j < BOARDSIDE; j++)
                {
                    if (board[i,j] > 0)
                    {
                        boardLabel.Text += "$ ";
                    }
                    else
                    {
                        boardLabel.Text += "0 ";
                    }
                }
                boardLabel.Text += "\r\n";
            }
        }

        private bool SolutionFound(int[,] board)
        {
            for (int i = 0; i < BOARDSIDE; i++)
            {
                for (int j = 0; j < BOARDSIDE; j++)
                {
                    if (board[i,j] == 0)
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        private void Search(int row, int column)
        {
            if (! SolutionFound(board))
            {
                if (CheckPosition(row, column))
                {
                    if (board[row, column] == 0 && CheckPosition(row + 1, column + 2))
                    {
                        row++;
                        column += 2;
                        board[row, column] = 1;
                    }
                    else if (board[row , column] == 1 && CheckPosition(row + 2, column + 1))
                    {
                        row += 2;
                        column++;
                        board[row, column] = 2;
                    }
                    else if (board[row, column] == 2 && CheckPosition(row + 2, column - 1))
                    {
                        row += 2;
                        column--;
                        board[row, column] = 3;
                    }
                    else if (board[row, column] == 3 && CheckPosition(row + 1, column - 2))
                    {
                        row++;
                        column -= 2;
                        board[row, column] = 4;
                    }
                    else if (board[row, column] == 4 && CheckPosition(row - 1, column - 2))
                    {
                        row--;
                        column -= 2;
                        board[row, column] = 5;
                    }
                    else if (board[row, column] == 5 && CheckPosition(row - 2, column - 1))
                    {
                        row -= 2;
                        column--;
                        board[row, column] = 6;
                    }
                    else if (board[row, column] == 6 && CheckPosition(row - 2, column + 1))
                    {
                        row -= 2;
                        column++;
                        board[row, column] = 7;
                    }
                    else if (board[row, column] == 7 && CheckPosition(row - 1, column + 2))
                    {
                        row--;
                        column += 2;
                        board[row, column] = 8;
                    }
                    else
                    {
                        StepBack(ref row, ref column);
                    }
                    Search(row, column);
                }
                DisplayBoard(board);
            }   
        }

        private void generateButton_Click(object sender, EventArgs e)
        {
            // empty chessboard
            for (int i = 0; i < BOARDSIDE; i++)
            {
                for (int j = 0; j < BOARDSIDE; j++)
                {
                    board[i, j] = 0;
                }
            }
            
            Search(0, 0);
        }
    }

thanks in advance
pygmalion

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.