今天做USACO做到Section 1.5的Checker Challenge

直接dfs之后的结果是,超时。。

百度查查才想起来就是八皇后问题。有人讲怎么利用对称性怎么怎么优化,我没仔细看

直到看到这个

http://www.matrix67.com/blog/archives/266

matrix67写的位运算教程,其中有个“n皇后问题位运算版”,人称最快的n皇后问题解法!

马上翻译成C套进我的程序里,通过!~最后一个test才用了0.162秒。。


这是之前超时的程序,在第八个test时卡住。。:

/* ID: lingxiu1 PROG: checker LANG: C++ */#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,num[14],total=0; int f[14][14],flag[14]; void dfs(int l){for(int i=0;i<n;i++){if(f[l][i]==0&&flag[i]==0){num[l]=i;if(l==n-1){total++;if(total<4){printf("%d",num[0]+1);for(int g=1;g<n;g++){printf(" %d",num[g]+1);}printf("/n");continue;}}int a=l,b=i,c=l,d=i;if(a>b){b=0;a=l-i;}else {a=0;b=i-l;}for(;a<n&&b<n;a++,b++){f[a][b]++;}if(c+d<n){d+=c;c=0;}else {c-=n-1-d;d=n-1;}for(;c<n&&d>=0;c++,d--){f[c][d]++;}flag[i]=1;dfs(l+1);flag[i]=0;for(a--,b--;a>=0&&b>=0;a--,b--){f[a][b]--;}for(c--,d++;c>=0&&d<n;c--,d++){f[c][d]--;}}} } int main(){//freopen("checker.in","r",stdin);//freopen("checker.out","w",stdout);scanf("%d",&n);memset(f,0,sizeof(f));memset(flag,0,sizeof(flag));dfs(0);printf("%d/n",total);system("pause");return 0; }


这是n皇后问题的位运算版C语言版:

#include<cstdio> #include<iostream> using namespace std; int n,sum=0; int upperlim;void test(int row,int ld,int rd){int pos,p;if(row!=upperlim){pos=upperlim&~(row|ld|rd);while(pos){p=pos&(-pos);pos-=p;test(row+p,(ld+p)<<1,(rd+p)>>1);}}else sum++; }int main(){printf("输入n:"); scanf("%d",&n);upperlim=(1<<n)-1;test(0,0,0);printf("结果是:"); printf("%d/n",sum);system("pause"); }

test函数是主要部分,使用之前初始化upperlim=(1<<n)-1,sum=0,调用test(0,0,0)后输出sum既n皇后的摆法数~

回学校后收进模板库···


两者结合后通过的代码。。:

/* ID: lingxiu1 PROG: checker LANG: C++ */#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,num[14],upperlim,sum=0,total=0; int f[14][14],flag[14]; void dfs(int l){if(total>3) return ;for(int i=0;i<n;i++){if(f[l][i]==0&&flag[i]==0){num[l]=i;if(l==n-1){total++;if(total<4){printf("%d",num[0]+1);for(int g=1;g<n;g++){printf(" %d",num[g]+1);}printf("/n");}else break;continue;}int a=l,b=i,c=l,d=i;if(a>b){b=0;a=l-i;}else {a=0;b=i-l;}if(c+d<n){d+=c;c=0;}else {c-=n-1-d;d=n-1;}for(;a<n&&b<n;a++,b++){f[a][b]++;}for(;c<n&&d>=0;c++,d--){f[c][d]++;}flag[i]=1;dfs(l+1);flag[i]=0;for(a--,b--;a>=0&&b>=0;a--,b--){f[a][b]--;}for(c--,d++;c>=0&&d<n;c--,d++){f[c][d]--;}}} } void test(int row,int ld,int rd){int pos,p;if(row!=upperlim){pos=upperlim&~(row|ld|rd);while(pos){p=pos&(-pos);pos-=p;test(row+p,(ld+p)<<1,(rd+p)>>1);}}else sum++; } int main(){freopen("checker.in","r",stdin);freopen("checker.out","w",stdout);scanf("%d",&n);memset(f,0,sizeof(f));memset(flag,0,sizeof(flag));dfs(0);upperlim=(1<<n)-1;test(0,0,0);printf("%d/n",sum);//system("pause");return 0; }

usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)相关推荐

  1. USACO Section 1.5 Checker Challenge

    经典八皇后问题 只写的最基本的,对称剪枝,位运算都没有用,以后有时间再看 1 /* ID:linyvxi1 2 PROB:checker 3 LANG:C++ 4 */ 5 #include < ...

  2. USACO 1.5.4 Checker Challenge

    题意:经典的八皇后问题 解法: 采用朴素的每一次放置都与前面的所有行进行比较,在N =13的时候时间会爆掉 <入门经典>上提供的方法很经典,vis数组的使用,具体见<入门经典> ...

  3. USACO 6.5.5 Checker Challenge 回溯

    http://train.usaco.org/usacoprob2?a=BI4LEPNXcEa&S=checker 题目大意:在一个N*N的棋盘上放棋子,要求每一行每一列都有一个,每一个对角线 ...

  4. 【USACO题库】1.5.4 Checker Challenge跳棋的挑战

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 1 2 3 4 5 6 --------- ...

  5. usaco6.5.5 Checker Challenge

    一 原题 Checker Challenge Examine the 6x6 checkerboard below and note that the six checkers are arrange ...

  6. USACO Section 4.2 题解

    最近开始做荒废了好久的USACO,希望能够以一天一个Section的速度做完吧.题解也会每天更新. Drainage Ditches(ditch) 本题是个最基本的网络流.这里我用的Dinic算法,递 ...

  7. P1219 [USACO1.5]八皇后 Checker Challenge 题解

    background:给朋友讲题,顺便过了这道几年前遗留的题 P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn ...

  8. 洛谷P1219 [USACO1.5]八皇后 Checker Challenge(C语言)

    洛谷P1219 [USACO1.5]八皇后 Checker Challenge 题目 代码 这个八皇后问题也是经典入门深搜的题目了呀,理论上深搜都可以运用数据结构的栈来模拟计算机内部的压栈操作.但这里 ...

  9. 八皇后 Checker Challenge

    题目 : 八皇后 Checker Challenge 前言 : 深度优先搜索也是一种暴力枚举的算法,但是相较于循环枚举这种固定层数而且不能随意增减层数的枚举形式来说, DFS更具有优势,因为DFS是逐 ...

最新文章

  1. java 正则 捕获_Java通过正则表达式捕获组中的文本
  2. 现在给你三百台服务器,你怎么对他们进行管理?
  3. 如何将类序列化并直接存储入数据库
  4. CSS基础----元素分类
  5. jdk1.8 Windows安装全过程详尽版
  6. Ubuntu14.04如何备份和恢复系统
  7. 冬知寒,我方暖,3本Python好书赠你慢慢品
  8. 将数组的列表结构转成树结构
  9. Eclipse — 如何导入包
  10. Linux经常使用命令(十六) - whereis
  11. [HDU4585]Shaolin
  12. “搏一搏,单车变摩托!”华为天才少年耗时四个月,将自行车强势升级为自动驾驶...
  13. k2p华硕系统怎么设置_【华硕 RT-AC68U 无线路由器使用感受】管理|系统|操作|模式_摘要频道_什么值得买...
  14. 微信小程序底部导航栏配置
  15. kdj指标主要看哪个值_史上最全KDJ指标用法详解,学习KDJ指标看这一篇就够了
  16. 应用进展_解释的标准事件:第2部分–应用和进展
  17. java解析json字符串数据
  18. 3ds max 旋转及角度
  19. python实现全自动百词斩单词对战,躺着上分轻轻松松
  20. 《微积分:一元函数积分学》——基本积分表

热门文章

  1. 如何使用镭速保护云存储数据安全
  2. vue中使用el-table设置排名前三用金银铜的图标展示,其余排名正常展示
  3. 为什么会出现失眠 什么原因导致的
  4. libgdx小白练手-跑酷游戏
  5. ECMAScript 6的基础认知
  6. 如何将EML格式邮件导入notes数据库中
  7. 面试技巧-面试问题回答
  8. 基于Opencv和Mediapipe实现手势控制音量
  9. 使用Rancher搭建k8s集群
  10. 智能盘点,Yolo用于钢筋检测计数