C语言-回溯例1
回溯法解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的更多相关文章
- C语言-回溯例4
1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题: 把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面 ...
- C语言-回溯例3
排列问题 1.实现排列A(n,m)对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m).2. 回溯算法设计设置一维数组a,a(i)(i=1,2,…,m)在1—n中取值.首先从 ...
- C语言-回溯例2
组合问题 组合:从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合,例如OR = {1,2,3,4}, n = 4, r = 3则无重组合为: {1,2 ...
- C语言 指针例解
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元 ...
- Python语言100例
Python版本:python 3.2.2 电脑系统:win7旗舰 实例来源:python菜鸟教程100例 #!/usr/bin/python # -*- coding: UTF-8 -*- impo ...
- C语言回溯算法解决N皇后问题
回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...
- 动态语言的灵活性是把双刃剑 -- 以Python语言为例
本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特 ...
- 以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记
其实大多数的编译器本身就能提供一些简单的优化,比如gcc就能通过使用 -O2 或者 -O3 的选项来优化程序.但编译器的优化始终也是有限,因为它必须小心翼翼保证优化过程不对程序的功能有改动.故而程序员 ...
- 浮点数运算的精度问题:以js语言为例
在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 ...
随机推荐
- javascript是脚本语言?javascript万物皆对象?
呵呵哒!带你见识下js面对对象的魅力 是的是的,退后,朕要开始装逼了- 这是什么鸟东西?是的是的,装逼开始,2016年度最佳JS编译器,ES6标准出来后,小伙伴们对新特性摩拳擦掌,奈何浏览器支持把我们 ...
- CCF第四题无向图打印路径 欧拉问题
#include<iostream> #include<vector> #include<algorithm> #include<stack> #def ...
- php默认有最大执行时间
执行php默认有最大执行时间,默认30s,修改,不能设置’1h’,貌似单位不能修改
- iOS学习笔记36-Masonry自动布局
一.Masonry介绍 之前我们在屏幕适配的章节中学习过AutoLayout的使用,但那都是在可视化界面上进行添加约束完成的,我们很多时候都需要在代码中使用AutoLayout约束,苹果也为我们提供了 ...
- 【bzoj2301】[HAOI2011]Problem b 莫比乌斯反演
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- 在vue单页面应用当中使用sass
之前在项目当中有使用过sass,但是使用的方式有点Low,是在vue文件当中的style下面通过@import的方式引入的. 其实在webpack当中也可以通过在main.js当中import &qu ...
- 代码动态改变 NGUI UILabel 的字体
有一次因为 ttf 分成简体和繁体两个..所以就需要动态改变NGUI 中 UILabel 的字体,但是不知道 UILabel 保存字体的字段是哪个 网上搜到..在这里记录一下 using UnityE ...
- FZOJ Problem 2219 StarCraft
...
- 【CF1025C】Plasticine zebra(模拟)
题意: n<=1e5 思路:可以证明答案即为极长交替出现的串长度之和 需要注意其实这个串是一个环,复制后再做 #include<cstdio> #include<cstring ...
- 電池的標稱電壓 與 power consumption 量測
電池標稱電壓 定義如下圖, 以25度為例,20度再往上點, 4V 放一下電就往下掉, 3V 放一下電就往下掉, 假設 3.8V 是擁有最多 capacity 可以 discharge 的電壓,放電放了 ...