一般而言,回溯法可以说是一种穷举法,适合于求解各种深度优先搜索的问题。

回溯法是一种应用广泛的算法。其关键点是解空间树和n元组可行解的定义。

非递归回溯法程序的结构基本上是相同的,该程序的结构可以用求解各种类似的问题,例如图的着色问题等。

/** 【问题描述】在一个8×8的国际象棋棋盘上放置8个皇后,* 要求每个皇后两两之间不“冲突”,即没有一个皇后能“吃* 掉”任何其他一个皇后,简单的说就是没有任何两个皇后* 占据棋盘上的同一行或同一列或同一对角线,即在每一横* 列、竖列、斜列都只有一个皇后。** 非递归法(回溯法)求出8个皇后问题的解** 本程序通过修改宏定义MAXQUEEN的值,可以解决N皇后问题。**/#include <stdio.h>
#include <conio.h>#define TRUE 1
#define FALSE 0
#define MAXQUEEN 4
#define ABS(x) ((x>0)?(x):-(x))  /*求x的绝对值*//*存放8个皇后的列位置,数组下标为皇后的列位置*/
int queen[MAXQUEEN];
int total_solution = 0;  /*计算共有几组解*//*函数原型声明*/
void backtrack();
int attack(int,int);
void output_solution();int main(void)
{backtrack();return 0;
}/* 回溯法求解八皇后问题 */
void backtrack()
{int row = 0;queen[row] = -1;while(row >= 0){queen[row]++;while(queen[row] < MAXQUEEN && attack(row, queen[row]))queen[row]++;if(queen[row] < MAXQUEEN)if(row == (MAXQUEEN-1))output_solution(); /* 输出此组解 */elsequeen[++row] = -1;elserow--;}
}/* 测试在(row,col)上的皇后是否遭受攻击若遭受攻击则返回值为1,否则返回0 */
int attack(int row, int col)
{int i, atk=FALSE;int offset_row, offset_col;i=0;while(!atk && i<row){offset_row=ABS(i-row);offset_col=ABS(queen[i]-col);/* 判断两皇后是否在同一列,是否在同一对角线 *//* 若两皇后在同列或同对角线,则产生攻击,atk==TRUE */atk = (queen[i] == col) || (offset_row == offset_col);i++;}return atk;
}/* 输出8个皇后的解 */
void output_solution()
{int x,y;total_solution += 1;printf("Solution#%3d\n\t",total_solution);for(x=0;x<MAXQUEEN;x++){for(y=0;y<MAXQUEEN;y++)if(y==queen[x])printf("Q"); /* 用字母Q表示皇后 */elseprintf("-"); /* 用-表示空白 */printf("\n\t");}printf("\n");getchar();
}

非递归求解N皇后问题(回溯法)相关推荐

  1. n皇后问题-回溯法求解

    n皇后问题-回溯法求解 1.算法描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. n皇后是由八皇后问题演变而来的.该问题 ...

  2. 迷宫的非递归求解 C语言 数据结构课程设计

    非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...

  3. 求解最小机器重量(回溯法/分支限界)

    求解最小机器重量(回溯法/分支限界) 回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用DFS深度优先,会马上得到一个结果,然后比较当前选择的重量 ...

  4. 回溯法解决N皇后问题——递归与非递归求解

    回溯法其实也是一种搜索算法,它可以方便的搜索解空间.  回溯法解题通常可以从以下三步入手:  1.针对问题,定义解空间  2.确定易于搜索的解空间结构  3.以深度优先的方式搜索解空间,并在搜索的过程 ...

  5. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)

    0-1背包问题,在搜索过程中使用递归来完成. package com.test; class Pack { int n = 8; //物品个数 int W = 110; //背包总容量 int[] W ...

  6. 八皇后问题 回溯法hdu2553

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. n皇后问题(回溯法)

    目录 1.问题描述 2.问题分析 3.完整源码 1.问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的.问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同 ...

  8. 八皇后问题、N皇后问题回溯法详解

    /* * 回溯法解N皇后问题 * 使用一个一维数组表示皇后的位置 * 其中数组的下标表示皇后所在的行 * 数组元素的值表示皇后所在的列 * 这样设计的棋盘,所有皇后必定不在同一行 * * 假设前n-1 ...

  9. 8皇后问题--回溯法 (循环递归)

    N皇后问题 问题描写叙述: N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自己主动攻击) 1.因为每一个棋子不可能同行. ...

最新文章

  1. Ext4核心组件Grid的变化及学习(3):可编辑的grid
  2. C和指针之编译出现warning: implicit declaration of function ‘matrix_multiply‘ is invalid in C99问题
  3. Apollo进阶课程㉔丨Apollo 规划技术详解——Motion Planning Environment
  4. python爬虫第二课:url解析
  5. 密集人体姿态估计:2D图像帧可实时生成UV贴图(附论文)
  6. UITextField 文字垂直居中
  7. Windows下VB6.0开发——VB程序断点调试与顺序执行不一致问题(通信原因)
  8. Cesium:地球中实现点击浮动弹窗
  9. linux的基本的命令行操作
  10. 二级域名共享cookies
  11. asr语音转写_利用Real-time ASR语音转写服务实现直播实时弹幕提升用户体验
  12. 计算机是如何储存信息的,计算机是如何储存信息的
  13. Spring Cloud 系列之 Netflix Eureka 注册中心
  14. css渐变背景色与切角
  15. HTML常用标签(上)
  16. 计算机语言输入不见了,电脑输入法为什么不见了
  17. java sqlite 多线程并发_C#_C#解决SQlite并发异常问题的方法(使用读写锁),本文实例讲述了C#解决SQlite并 - phpStudy...
  18. 计算机移动互联网是学什么,学移动互联网开发需要学些什么课程?
  19. 【论文笔记】Mask2Former: Masked-attention Mask Transformer for Universal Image Segmentation
  20. 电脑上最好的3个小说阅读器

热门文章

  1. Android ListView 实现下拉刷新上拉加载
  2. 5.3.2 先行发生
  3. 工作中常用知识点、工具总结
  4. 网络映射连接不上_Mac连接不上无线网络的解决方法
  5. Doris之物化视图
  6. HIve map jion的原理、操作和使用场景
  7. mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
  8. structured Streaming
  9. 从集合(内存)中创建RDD
  10. 图像变换——图像反转