自己写的代码,求解八皇后问题的单一解及全部解。写得并不好,不过还是小结下。
为了自己中途调试的直观,声明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