“八皇后”问题 18501 崔萌萌 吕金华.

Slides:



Advertisements
Similar presentations
中医内科 陈良金. 目的要求: 熟悉虚劳的证候特征。 了解虚劳的发病与气血阴阳及五脏的关系。 掌握虚劳和肺痨及一般虚证的区别与联系。 掌握虚劳的治疗要点。 熟悉虚劳各个证型的辨证论治。 了解虚劳的预后及调摄护理。
Advertisements

写作中的几点小技巧 金乡县羊山中学 张秀玲. 一、写外貌不用 “ 有 ” 作文如何来写外貌?同学们的作文里总会出现类 似这样的句子: “ XX 可漂亮了,她有一头卷卷的黄头 发,有一双乌黑的葡萄般的大眼睛,有高高的鼻子, 还有一张樱桃小嘴。 ” 如果试着去掉文中的 “ 有 ” ,把文字重新修改一遍,
十大写作技巧. 一、写外貌不用 “ 有 ” 作文如何写外貌?孩子的作文里总会看到类似这样的名 子: “XX 可漂亮了,她有一头卷卷的黄头发,有一双乌黑的 葡萄般的大眼睛,有一个高高的鼻子,还有一张樱桃小嘴。 ” 如果你试着让他们去掉文中的 “ 有 ” ,把文字重新串联一遍, 会发现作文顺了很多。 写上段文字的同学经蒋老师指导后修改如下:
While 迴圈 - 不知重複執行次數
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
复习回顾 … , 1、算术平均数的概念: 一般地,对于n个数 我们把 叫做这n个数的算术平均数,简称平均数. 2、加权平均数的定义
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
计算机三级考试C语言上机试题专题.
高考考试说明解读 --政治生活.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
C 程序设计实例 1. 问题描述 2. 数据结构 3. 算法分析 4. 参考程序 5. 改进说明.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
Do.For.While.正三角.倒正三角.倒九九乘法表
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
排序 Sorting.
快速排序法 (Quick Sort).
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
搜尋資料結構 Search Structures.
STRUCTURE 授課:ANT 日期:2010/5/12.
Function.
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
程式撰寫流程.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
中国科学院软件研究所 计算机科学国家重点实验室 张文辉
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
計數式重複敘述 for 迴圈 P
C Programming in Action
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
C语言复习2----函数.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C程序设计.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
Introduction to the C Programming Language
C语言程序设计 教案 崔武子制作
函式庫補充資料.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第一章 C语言概述 教师:周芸.
C语言程序设计 李祥 QQ:
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
累堆排序法 (Heap Sort).
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第七章  数 组.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
第十二章 位运算.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Introduction to the C Programming Language
函式庫補充資料 1.
隨機函數.
Presentation transcript:

“八皇后”问题 18501 崔萌萌 吕金华

问题阐述如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃 大家跟我一起做吧!!! 问题阐述如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃 为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

历史 八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。 艾兹格·迪杰斯特拉在1972年用这个问题为例来说明他所谓结构性编程的能力。 八皇后问题在1990年代初期的著名电子游戏第七访客和NDS平台的著名电子游戏雷顿教授与不可思议的小镇中都有出现。

1 明确走法 后(Queen)是最强的棋子,可横走、直走或斜走,移动步数不限,但不可转向或越过其他棋子。可以说是车与象的结合。

2 分析问题 我们采用逐步试探的方式,先从一个方向往前走, 2 分析问题 我们采用逐步试探的方式,先从一个方向往前走, 能进则进,不能进则退,尝试另外的路径。我们将棋盘看作是一个8*8的数组,这样可以使用一种蛮干的思路去解决这个问题,这样我们就是在8*8=64个格子中取出8个的组合,C(64,80) = 4426165368,显然这个数非常大,在蛮干的基础上我们可以增加回溯,从第0列开始,我们逐列进行,从第0行到第7行找到一个不受任何已经现有皇后攻击的位置, 用回溯的方法解决8皇后问题的步骤为: 1)从第一列开始,为皇后找到安全位置,然后跳到下一列 2)如果在第n列出现死胡同,如果该列为第一列,棋局失败,否则后退到上一列,在进行回溯 3)如果在第8列上找到了安全位置,则棋局成功。 8个皇后都找到了安全位置代表棋局的成功,用一个长度为8的整数数组进行回溯,直到为0-7列都找到了安全位置或者找遍这些列都找不到安全位置的时候终止。

代码代码!!! 注意输出分为两部分1 计算排列种数 2 罗列排列方法

#include <stdio.h> #include <stdlib.h> #include <math.h> int n=8;定义的一个全局变量 int x[9];一个含有九个元素的一维数组 元素下角标用来表示皇后所在的列数,由题意知每一列必有一个皇后,所以我们规定皇后的列不变,只进行行移动 int num=0;计数 int place (int k)位置函数 void nqueens (int n)移动函数

int main() 简短的主程序。。。。。 { nqueens(n); return 0; }

void nqueens (int n)定义一个函数用来移动皇后的位置 { int i; x[0]=x[1]=0;第一个皇后和第二个皇后放在同一列 int k=1; while (k>0) x[k]+=1;将第二个皇后移动一行 while (x[k]<=n&&0==place(k))调用函数判断位置是否 { 符合条件 x[k]+=1; }

if (x[k]<=n) { 计数结构 if (k==n) { num++; printf ("%d\t",num);

for (i=1;i<=n;i++) { printf("%d\t",x[i]);输出第i 个皇后的行位置 } printf ("end\n"); else k++; x[k]=0; k--;回溯结构若X>8时进入此结构,移动上一个皇后的位置

int place (int k) 定义一个函数来判断皇后的位置是否符 合条件 { int i=1; while (i<k) if (x[i]==x[k] 判断同一行是否有两个皇后||(fabs(x[i]-x[k])==fabs(i-k)))判断一个皇后的四个对角方向是否有其他皇后 return 0;若符合条件返回值为零 i++;进入下一列的判断 } return 1;

问题时间!!!