回溯法解N皇后问题

1,代码分析:

使用一个一维数组表示皇后的位置

其中数组的下标表示皇后所在的行

数组元素的值表示皇后所在的列

这样设计的棋盘,所有皇后必定不在同一行

假设前n-1行的皇后已经按照规则排列好

那么可以使用回溯法逐个试出第n行皇后的合法位置

所有皇后的初始位置都是第1列

那么逐个尝试就是从1试到N

如果当前行的皇后的位置还是在1到N的合法范围内

那么首先要判断该行的皇后是否与前几行的皇后互相冲突

如果冲突,该行的皇后的位置加1,继续尝试

如果不冲突,判断下一行的皇后

如果已经是最后一行,说明已经找到一个解,输出这个解

然后最后一行的皇后的位置加1,继续尝试下一个解

2,代码实现:

 /**************x皇后问题***************/
#include <stdio.h>
#define N 4//自定义皇后的个数
int myabs(int a,int b)
{
return a>b?(a-b):(b-a);
}
int main()
{
int i,j,num,a[];
int k;
int flag;//设置标志位,用来判断是否满足约束条件
i=;
a[]=;//设初值
num=;//记录解得个数
while()
{
flag=;
for(k=i-;k>=;k--)
{
if((a[k]==a[i])||myabs(a[k],a[i])==(i-k))//满足约束条件
flag =;//改变标志位,表示不满足条件
}
if(flag&&(i==N))//输出一组解
{
num++;
for(j=;j<=N;j++)
{
printf("%d",a[j]);
}
printf(" ");
if((num%)==)
{
printf("\n");
}
}
if(flag&&i<=N)
{
i++;
a[i]=;//取初值
continue;
}
while(a[i]==N&&i>)i--;//回溯
if(a[i]==N&&i==)
{
break;
}
else
{
a[i]++;//改变另一条路径
}
}
printf("\n解得个数为%d",num);
return ;
}

运行结果:

3,代码实现:

 /**************x皇后问题***************/
#include <stdio.h>
#define N 8//自定义皇后的个数
int myabs(int a,int b)
{
return a>b?(a-b):(b-a);
}
int main()
{
int i,j,num,a[];
int k;
int flag;//设置标志位,用来判断是否满足约束条件
i=;
a[]=;//设初值
num=;//记录解得个数
while()
{
flag=;
for(k=i-;k>=;k--)
{
if((a[k]==a[i])||myabs(a[k],a[i])==(i-k))//满足约束条件
flag =;//改变标志位,表示不满足条件
}
if(flag&&(i==N))//输出一组解
{
num++;
for(j=;j<=N;j++)
{
printf("%d",a[j]);
}
printf(" ");
if((num%)==)
{
printf("\n");
}
}
if(flag&&i<=N)
{
i++;
a[i]=;//取初值
continue;
}
while(a[i]==N&&i>)i--;//回溯
if(a[i]==N&&i==)
{
break;
}
else
{
a[i]++;//改变另一条路径
}
}
printf("\n解得个数为%d",num);
return ;
}

运行结果:

C语言-回溯例1的更多相关文章

  1. C语言-回溯例4

    1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题: 把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面 ...

  2. C语言-回溯例3

    排列问题 1.实现排列A(n,m)对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m).2. 回溯算法设计设置一维数组a,a(i)(i=1,2,…,m)在1—n中取值.首先从 ...

  3. C语言-回溯例2

    组合问题 组合:从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合,例如OR = {1,2,3,4}, n = 4, r = 3则无重组合为: {1,2 ...

  4. C语言 指针例解

    在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元 ...

  5. Python语言100例

    Python版本:python 3.2.2 电脑系统:win7旗舰 实例来源:python菜鸟教程100例 #!/usr/bin/python # -*- coding: UTF-8 -*- impo ...

  6. C语言回溯算法解决N皇后问题

    回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...

  7. 动态语言的灵活性是把双刃剑 -- 以Python语言为例

    本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特 ...

  8. 以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记

    其实大多数的编译器本身就能提供一些简单的优化,比如gcc就能通过使用 -O2 或者 -O3 的选项来优化程序.但编译器的优化始终也是有限,因为它必须小心翼翼保证优化过程不对程序的功能有改动.故而程序员 ...

  9. 浮点数运算的精度问题:以js语言为例

    在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00  ...

随机推荐

  1. angular2 通过指令限制输入

    最近在写一个表单,有些输入框只能输入数字,单又不想每次写表单的时候,都要去验证输入的是不是数字, 那么就想到直接限制只能输入数字,通过指令实现 这里需要注意的是,不只更改DOM的值,如果input为数 ...

  2. kb-07专题线段树-04--离散化;

    /* poj2528 线段树 好题,用到了离散化,二分定位,特殊的区间查寻方式:在下面的代码注释中有详细的解释: */ #include<iostream> #include<cst ...

  3. kmp-模板-hd-1711

    p数组记录的是当该位置上失配的时候,跳到第几个进行继续匹配: /* 题意:给两个数串,求模板串第一此出现在源串中的位置,开头的位置:没有输出-1: 算法:kmp 先对字符串进行自匹配: 然后串间匹配: ...

  4. 如何在c#代码中执行带GO语句的SQL文件

      需要在C#代码中执行一个SQL文件的内容.遇到了两个问题: 1. 因为SQL文件中有"GO"语句,执行时报错"Incorrect syntax near 'GO'.& ...

  5. BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】

    题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...

  6. ajax提交数据服务端返回报错

    报错如下: if response.get('X-Frame-Options') is not None:AttributeError: 'str' object has no attribute ' ...

  7. word文档的导出(用freemarker模板导出)(桃)

    1.将要导出的word文档另存为xml格式的 2.用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段 3.根据模板生成 package ...

  8. hdu 4937 2014 Multi-University Training Contest 7 1003

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  9. C语言集锦(一) C代码生成图片:BMP、PNG和JPEG

    1.生成BMP图片 在学习图形图像的过程中,最简单和常见的格式是BMP和PPM.下面将给出生成BMP的极度精简代码,然后讲解BMP格式. #include <stdio.h> #inclu ...

  10. dedecms--后台添加会员栏目(批量添加)

    最近在用dedecms二次开发会员功能,一开始做了一个会员添加,但是领导要求可以批量添加,最好是可以输入添加个数:这样我想添加几个就添加几个了 1:会员添加的htm页面 <html> &l ...