N皇后问题 1.dfs 2.位运算解决
2014-04-19 16:32
267 查看
1.dfs解法应该没什么好说了,入门dfs题
2.位运算解决(效率更高)
#include<stdio.h> #include<stdlib.h> #include<string.h> int tot; int n; int c[10000]; void dfs(int cur) { if(cur==n) { tot++; /*for(int i=0;i<n-1;i++) //输出路径 printf("%d ",c[i]); printf("%d\n",c[n-1]);*/ return ; } for(int i=0;i<n;i++) { int ok=1; c[cur]=i; for(int j=0;j<cur;j++) { if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]) { ok=0;break; } } if(ok) dfs(cur+1); } } int main() { while(scanf("%d",&n),n) { tot=0; dfs(0); printf("%d\n",tot); } return 0; }
2.位运算解决(效率更高)
#include<stdio.h> #include<string.h> int n,LIM,tot,q[11]; void dfs(int row,int ld,int rd) { if(row==LIM)//当皇后全部放好时,tot自加 { tot++; return ; } int pos=(~(row|ld|rd))&LIM; while(pos) { int p=pos&(~pos+1);//依次取最右边的1 dfs(row|p,(ld|p)<<1,(rd|p)>>1); pos-=p;//完成本层dfs后消去选取位置的p } } int main() { for(int i=1;i<=10;i++) { LIM=(1<<i)-1; tot=0; dfs(0,0,0); q[i]=tot; } while(~scanf("%d",&n),n) { printf("%d\n",q ); } return 0; }
相关文章推荐
- string转double
- UVa 11044 - Searching for Nessy
- vba学习_数据写入
- 微软2014编程之美初赛第一场——题目2 : 树
- install sun java in ubuntu
- Oracle中如何插入特殊字符: & 和 ' (多种解决方案)
- 浏览器显示网页的原理 多种情况方式
- [Android]ListView中item的重用
- msp 430 低功耗
- 求助:TreeView如何绑定数据库
- 你必须了解的session的本质
- orcale PL/SQL管理命令语句
- 【编程之美挑战赛第一场】树
- 编程之美初赛第一场 树
- iPhone UIButton 图标与文字间距设置
- Debian7.3下从源代码编译安装pidgin-lwqq
- 百度地图 弹窗显示
- Region-based Discriminative feature pooling for scene text recognition (CVPR14)
- 编程之美初赛第一场 题目1 : 焦距
- C语言,内存对齐,内存分配,地址操作,结构体(二)