UVA750回溯法典例-八皇后
文章代码选自UVA750-8 Queens Chess Problem的部分代码
vj题目链接:https://vjudge.net/problem/UVA-750
由于UVA中要求按照字典序输出,下面代码进行的特殊处理
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int rnum[];//rnum[x]:x列皇后的行编号
int solution[];
int cur=;
char aim[]; int pout()
{
sort(solution+,solution+);
printf("{");
int flag=;
for(int i=;i<;i++)
{
if(flag)printf(",");
flag=;
printf("%d",solution[i]);
}
printf("};");
//for(int i=1;i<93;i++)
// printf("%d->%d\n",i,solution[i]);
// printf("SOLN COLUMN\n");
// printf(" # 1 2 3 4 5 6 7 8\n\n");
// for(int i=1;i<93;i++)
// {
// printf("%2d ",i);
// //
// sprintf(aim,"%d",solution[i]);
// //printf("%d->%d\n",i,solution[i]);
// for(int k=0;k<8;k++)
// printf(" %c",aim[k]);
// printf("\n");
// }
return ;
} int solver(int c)
{
if(c==)
{//由于该问题的结果每一组只有八个数字,为方便打表这里组合成八位的int数
int snum=;
for(int i=;i<;i++)
snum=snum*+(rnum[i]);
solution[cur++]=snum;
//printf("->%d\n",snum);
}
else
{
for(int r=;r<=;r++)
{
rnum[c]=r;
int ok=;
for(int nc=;nc<c;nc++)
{
//rnum[nc]行nc列 与 rnum[c]行c列
//检查每一个列,是否有与该皇后同行的存在
if(rnum[nc]==rnum[c]||rnum[nc]-nc==rnum[c]-c||rnum[nc]+nc==rnum[c]+c)
{ok=;break;}
}//for
if(ok)solver(c+);
}//for
}//else
return ;
} int main()
{
memset(rnum,,sizeof(rnum));
memset(solution,,sizeof(solution));
memset(aim,,sizeof(aim));
solver();
pout();
return ;
}
运行上述代码,得到了结果如下:
{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
将其设计为数组初始化的形式,再按照UVA题目写程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;//下面的初始化直接将结果输入程序,减少时间
int cyc[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
char aim[][];
char psd[];
int pre()
{
memset(psd,,sizeof(psd));
for(int i=;i<;i++)
{
sprintf(&aim[i][],"%d",cyc[i]);
aim[i][]='\0';//重新分配成数组,方便检索
//printf("%s\n",&aim[i][1]);
}
return ;
} int main()
{
int n;
int x,y;
pre();
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&x,&y);
printf("SOLN COLUMN\n");
printf(" # 1 2 3 4 5 6 7 8\n\n");
int kase=;
char m=x+'';
for(int i=;i<;i++)
{
if(aim[i][y]==m)
{
printf("%2d ",++kase);
for(int k=;k<;k++)
printf(" %c",aim[i][k]);
printf("\n");
}
}
if(n!=)printf("\n");//注意空行问题,最后一组的最后没有空行
}
return ;
}
UVA750回溯法典例-八皇后的更多相关文章
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- C语言数据结构----递归的应用(八皇后问题的具体流程)
本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- Java编程思想—八皇后问题(数组法、堆栈法)
Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...
- LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- 回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- ACM:回溯,八皇后问题,素数环
(一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...
随机推荐
- Spring学习笔记:使用Pointcut 和Advisor实现AOP
基础知识 在 Spring AOP 中,有 3 个常用的概念,Advices . Pointcut . Advisor ,解释如下: Advices :表示一个 method 执行前或执行后的动作. ...
- Redis5.x五种数据类型常见命令
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- SAXParseException Content is not allowed in Prolog (前言中不允许有内容)
解析 XML 文件的时候,如 Mybatis 的 Mapper 文件,有时会出现 org.xml.sax.SAXParseException 前言中不允许有内容 的异常,英文就是 Content is ...
- 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...
- React之虚拟DOM中的Diff算法
一.React中的setState ( 异步函数,异步获取数据 ) 若操作的时间间隔短,它可以将多个setState结合成一个setState,减少虚拟DOM的比对次数,提高性能 二.同层虚拟DOM对 ...
- 使用Vue.prototype在vue中注册和使用全局变量
在main.js中添加一个变量到Vue.prototype Vue.prototype.$appName = 'My App' 这样 $appName 就在所有的 Vue 实例中可用了,甚至在实例被创 ...
- 修饰符 public、 private 和 protected和区别
TypeScript 可以使用三种访问修饰符(Access Modifiers),分别是 public.private 和 protected. public 修饰的属性或方法是公有的,可以在任何地方 ...
- 小浩算法|一文让你学会如何用代码判断"24"点
“24点”是一种数学游戏,正如象棋.围棋一样是一种人们喜闻乐见的娱乐活动.它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受.今天就为大家分享一道关于“24点” ...
- TFT液晶显示屏之绘图板应用
应用范例: 使用 TOPWAY Smart LCD (HMT043FC-1C) 绘图板应用 第一步建立工程 ① 开TOPWAY TML Graphic Editor 2017 V1.04软件, 点击菜 ...
- jvm 内存结构
jvm 内存结构 graph TB A(jvm)-->E(类加载器系统) A-->B(运行时数据区) A-->D(本地库接口) A-->C(执行引擎) B-->虚拟机栈 ...