博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.25回溯 n皇后问题,素数环,困难的串
阅读量:5293 次
发布时间:2019-06-14

本文共 1534 字,大约阅读时间需要 5 分钟。

回溯:当把问题分成若干个步骤时,如果当前部骤没有合法选择,则函数将返回上一级递归调用,这种现象称为回溯,因此,递归枚举算法有常被称为回溯法;

 

n皇后问题: 思考:1。从64个格子选出一个子集使得任意一个格子不在同一行同一列同一对角线上,即子集枚举问题,64个格子的子集有2^64个,太大不够好

2。从64个格子里选出8个格子,即组合生成问题,有C8 64 =4*10^9 种方案,仍不够好

继而发现:恰每行每列格放置一个皇后,如果用c[x]表示第x行皇后的列,则只有8!=40320种排列

实现: 数组坐标化 同一列 x1=x2 同一主对角线 y1-x1=y2-x2 同一副对角线 y1+x1=y2+x2

用数组 储存各皇后 的 这三项参数值

 

~如果有多组数据,先预处理打表,防止重复计算超时

#include
#include
using namespace std;int c[15],n,ans[15],k=0;int idx[5][40];void dfs(int cur){ if(cur>=n){k++; return;} for(int i=0;i

素数环 uva 524

~事先素数打表

~奇偶剪枝

#include
using namespace std;int a[20]={
0},b[20],c[40]={
0},n,ks=0;;void dfs(int cur){ if(cur>n&&c[b[n]+1]){ for(int i=1;i<=n;i++) if(i!=1)printf(" %d",b[i]); else printf("%d",b[i]); printf("\n"); return ; }//奇偶剪枝 if(cur%2==1){ for(int i=3;i<=n;i+=2){ if(c[i+b[cur-1]]&&!a[i]){ a[i]=1; b[cur]=i; dfs(cur+1); a[i]=0; } } } else for(int i=2;i<=n;i+=2){ if(c[i+b[cur-1]]&&!a[i]){ a[i]=1; b[cur]=i; dfs(cur+1); a[i]=0; } } }int main(){ b[1]=1; c[2]=c[3]=c[5]=c[7]=c[11]=c[13]=c[17]=c[19]=c[23]=c[29]=c[31]=1;//素数打表 while(scanf("%d",&n)!=EOF){ if(ks)printf("\n"); printf("Case %d:\n",++ks); dfs(2); } return 0;}

 

转载于:https://www.cnblogs.com/-ifrush/p/10319977.html

你可能感兴趣的文章
idea从gitlab获取代码
查看>>
使用 RUP 管理小型项目和团队
查看>>
七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
查看>>
php简单常用的API
查看>>
如何在 Mac 上创建一个 cocos2d 的项目
查看>>
kengenme2
查看>>
Android_adb详解
查看>>
Sitecore CMS中配置模板部分
查看>>
机器学习(一)——K-近邻(KNN)算法
查看>>
(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
查看>>
大數據超時處理。
查看>>
动态规划之切钢条
查看>>
# 第四十五篇 网络编程之CS架构
查看>>
C语言中assert的使用
查看>>
SVG.js 基础图形绘制整理(一)
查看>>
(1)SQL Server内存浅探
查看>>
html编码对照表
查看>>
Java 访问指示符
查看>>
vim如何选择ESC的键位绑定
查看>>
TFS中的项目门户网站远程无法访问的问题。
查看>>