递归调用在编程中是个十分重要的部分,掌握起来也有一定的难度。本篇将用经典例题----八皇后问题,来整理递归调用的思路。
首先明确,八皇后问题是什么?
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
即在一个8*8的棋盘上,每一行放置一个皇后,这个皇后所在的斜边竖边和横边都没有其他皇后。
先解决第一个问题,如何得到一个棋盘?
答案是二维数组。我们先建立一个行为8列为8的二维数组,每个元素的值用0和1表示,1表示有皇后,0表示无皇后,以此建立出一个棋盘。
#include <stdio.h>
#include "tyz.h"
#define WIDTH 8
int main() {
boolean chessboard[WIDTH][WIDTH] = {
0};
return 0;
}
tyz.h是我定义的一个头文件,里面有我经常要用到的宏和类型,boolean的本质是一个unsigned char类型,因为二维数组的元素只有0和1两种,为节省空间,使用boolean类型。
为方便修改棋盘的大小,在此将其定义成一个宏
以下为我的头文件代码,这个头文件在我的编程中会经常使用到。
#ifndef _TYZ_H_
#define _TYZ_H_
#define TRUE 1
#define FALSE 0
#define NOT_FOUND -1
typedef unsigned char boolean;
int skipBlank(const char *str);
boolean isRealStart(int ch);
#endif
定义完棋盘之后,我们需要将它显示出来,此时编写一个显示棋盘的函数。
void show(boolean (*chessboard)[WIDTH]);
void show(boolean (*chessboard)[WIDTH]) {
int row;
int col;
static int count = 0;
printf("第%d个解:\n", ++count);
for (row = 0; row < WIDTH; row++) {
for (col = 0; col < WIDTH; col++) {
printf