c++(八皇后)
八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。
初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低。不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^24次数据,还要判断各种条件,实际的计算复杂度还要比较这个高。其实我们仔细看一看,这中间很多的计算其实很多是不需要的,因为如果我们在某一行没有可以插入的数据的话,那么这后面的行其实就不用考虑了。也就是说,我们只有在保证前面 插入的物体都合法有效的情况下,才能进行下一次的物体插入。无谓的遍历只会是无用功。
那么,我们应该怎么做呢?其实步骤不太难:
(1)在第n行寻找可以插入的位置,中间涉及到位置合法性的判断
(2)如果没有可以插入的位置,返回
(3)如果有可以插入的位置, 插入数据。此时再判断是否已经是最后一行,如果是,打印输出返回;反之继续对下一行数据进行试探处理。
有了上面的步骤,我们就可以书写代码了。老规矩,朋友们可以自己先尝试一下。
a)定义全局堆栈和打印函数
static int gEightQueen[8] = {0};
static int gCount = 0;
void print()
{
int outer;
int inner;
for(outer = 0; outer <8; outer ++){
for(inner = 0; inner < gEightQueen[outer]; inner ++)
printf("* ");
printf("# ");
for(inner = gEightQueen[outer] + 1; inner < 8; inner ++)
printf("* ");
printf("\n");
}
printf("=====================================\n");
}
b)添加位置合法性的函数判断
int check_pos_valid(int loop, int value)
{
int index;
int data; for(index = 0; index < loop; index ++){
data = gEightQueen[index]; if(value == data)
return 0; if((index + data) == (loop + value))
return 0; if((index - data) == (loop - value))
return 0;
} return 1;
}
c) 八皇后遍历
void eight_queen(int index)
{
int loop; for(loop = 0; loop < 8; loop++){
if(check_pos_valid(index, loop)){
gEightQueen[index] = loop; if(7 == index){
gCount ++, print();
gEightQueen[index] = 0;
return;
} eight_queen(index + 1);
gEightQueen[index] = 0;
}
}
}
总结:
(1)迭代递归是编程的难点,需要自己好好实践,看别人写一百遍,不如自己写一遍
(2)递归的时候务必注意函数return的出口
(3)递归函数中语句的顺序不要随意更换
(4)递归函数中注意数据的保存和恢复
(5)递归函数也要验证,可以用程序验证法,也可以用其他函数的结果来验证
ps:
下面是完整的代码,大家可以直接保存成queue.cpp,直接编译运行即可。可以打印出所有92种情况,
#include <iostream>
using namespace std; static int gEightQueen[8] = {0};
static int gCount = 0; void print()
{
int outer;
int inner; for(outer = 0; outer <8; outer ++){
for(inner = 0; inner < gEightQueen[outer]; inner ++)
printf("* "); printf("# "); for(inner = gEightQueen[outer] + 1; inner < 8; inner ++)
printf("* "); printf("\n");
} printf("=====================================\n");
} int check_pos_valid(int loop, int value)
{
int index;
int data; for(index = 0; index < loop; index ++){
data = gEightQueen[index]; if(value == data)
return 0; if((index + data) == (loop + value))
return 0; if((index - data) == (loop - value))
return 0;
} return 1;
} void eight_queen(int index)
{
int loop; for(loop = 0; loop < 8; loop++){
if(check_pos_valid(index, loop)){
gEightQueen[index] = loop; if(7 == index){
gCount ++, print();
gEightQueen[index] = 0;
return;
} eight_queen(index + 1);
gEightQueen[index] = 0;
}
}
} int main(int argc, char* argv[])
{
eight_queen(0);
printf("total = %d\n", gCount);
return 1;
}
c++(八皇后)的更多相关文章
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- Python解决八皇后问题
最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...
- OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
1700:八皇后问题//搜索 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...
- C#八皇后问题 枚举值
记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...
- 八皇后(dfs+回溯)
重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...
- C语言解决八皇后问题
#include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
随机推荐
- [数据清洗]-使用 Pandas 清洗“脏”数据
概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...
- cd 命令详解
cd 命令 作用: cd 用来切换目录,目录表示法可为绝对路径或相对路径, 若目录名称省略,则变换至使用者的登陆目录. ~ 可表示为家目录,.为当前目录,..为上级目录 语法: cd (选项)(参数 ...
- python:发送消息给微信企业号
# -*- coding:utf-8 -*- import requests import json ''' 基础环境:微信企业号 version:python 2.7 ''' class Send_ ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- tideways+xhgui搭建php 7的性能测试环境
前言 我之前使用的是xhprof+xhgui分析线上环境的性能,然而PHP版本升级到PHP 7之后,xhprof已经不可用,于是改用tideways+xhgui,这实际上也是PHP7下开源方案的唯一选 ...
- python 小脚本升级-- 钉钉群聊天机器人
一则小脚本(工作中用) 在这篇文章中写的监控的脚本,发送监控的时候 是利用的邮箱,其实在实际,邮箱查收有着不方便性,于是乎升级, 我们工作中,经常用钉钉,那么如果要是能用到钉钉多好,这样我们的监控成功 ...
- Python 接口测试(十)
这里对接口测试9 进行优化升级,前端进行重构后的代码,源码已经开源 经过将近一个月的编写 , TIAPTest 接口测试平台 , 已经部署到服务器,开始运行了. http://60.205.187.1 ...
- NodeJS之微信开发
... 由于工作原因,太久没有写博客了,惭愧. 一直在说要买云服务器,前几天终于买了3个月,拿到之后就开始玩我最爱的nodejs,每天都是搞到12点1点过,乐此不疲啊. 从昨天开始玩的微信公众号,到今 ...
- Python函数参数的五种类型
之前项目需求,需要通过反射获取函数的参数,python中可以通过函数签名(signature)来实现. 首先需要了解函数参数的类型,Python的参数类型一共有5种:POSITIONAL_OR_KEY ...
- php 面向对象三大特点:封装、继承、多态
在讲解这三大特性前,我们先讲访问修饰符. php中有3中访问修饰符:public protected private: public:表示公有的:可在本类.子类.对象实例中访问. protected: ...