【C语言基础】->递归调用->八皇后问题

递归调用在编程中是个十分重要的部分,掌握起来也有一定的难度。本篇将用经典例题----八皇后问题,来整理递归调用的思路。

首先明确,八皇后问题是什么?
八皇后问题其中一解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值