自己写的代码,求解八皇后问题的单一解及全部解。写得并不好,不过还是小结下。
为了自己中途调试的直观,声明char chess[8][8],这个变量用来存放棋盘的实时状态,其中“*”表示空白的棋格,“Q”表示放置了皇后的棋格,所以比如说其中的一个解就表示成这样:
No.25:
* * Q * * * * *
* * * * * Q * *
* * * * * * * Q
* Q * * * * * *
* * * Q * * * *
Q * * * * * * *
* * * * * * Q *
* * * * Q * * *
其实这样做根本没有必要,事实上只需要用一个数组记录从第0行到第7行,每个皇后的列数就可以了。之所以用chess记录棋盘的实时状态,只是为了直观一些。
这样做的一个坏处就是,放置皇后需要把数组中的相应元素赋值为“Q”,而一旦某一行没有地方可以放皇后,需要回溯的时候,要把之前的一个皇后“擦掉”,白白增加了代码量。
函数调用的格式是queens(char (*chess)[8], int m,int row,int column);这里chess是棋盘,m的含义是尝试放置第m个皇后;row和column是棋盘中的行值和列值。连起来,这个调用的意思就是从第row行第column列开始,尝试放置第m个皇后。显然,在程序运行的过程中,m和row的值总是相同的。
back_row和back_column数组分别存储每一个皇后所在的行和列。其实对于每一个解,back_row的值总是{0,1,2,3,4,5,6,7},所以这个变量也是不必要的,声明它只是为了对称起见……
程序从第0行开始,逐行试探。如果发现m行的8个棋格都不能放置皇后,那么就倒退回第m-1行,把第m-1的皇后拿掉,然后从下一个位置开始试探(放置第m-1个皇后)。但是这里有个问题,如果第m-1行的皇后是在第7列(最后一列),因为我们是从