DFS hdu2553 N皇后问题
2015-07-20 17:40
225 查看
直接搜索就可以了
只是在标记数组vis上可以作文章
vis[0][i]来标记x为i的是否已放了棋子
vis[1][i]来标记y为i的是否已放了棋子
vis[2][i]来标记x+y为i的一斜行是否已放了棋子
vis[3][i]来标记x-y+n为i的是否已放了棋子
因为x-y可能为负数,所以加上一个n就不会出现负数了
最后,,因为测试样例非常多,但是N<=10,所以还需要打表
只是在标记数组vis上可以作文章
vis[0][i]来标记x为i的是否已放了棋子
vis[1][i]来标记y为i的是否已放了棋子
vis[2][i]来标记x+y为i的一斜行是否已放了棋子
vis[3][i]来标记x-y+n为i的是否已放了棋子
因为x-y可能为负数,所以加上一个n就不会出现负数了
最后,,因为测试样例非常多,但是N<=10,所以还需要打表
#include<cstdio> #include<cmath> #include<cstring> #include<queue> #include<vector> #include<functional> #include<algorithm> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int MX = 100 + 5; const int INF = 0x3f3f3f3f; int n,ans[MX]; int vis[4][MX]; void DFS(int x,int &ans){ if(x==n+1){ ans++; return; } for(int y=1;y<=n;y++){ if(!vis[0][x]&&!vis[1][y]&&!vis[2][x-y+n]&&!vis[3][x+y]){ vis[0][x]=vis[1][y]=vis[2][x-y+n]=vis[3][x+y]=1; DFS(x+1,ans); vis[0][x]=vis[1][y]=vis[2][x-y+n]=vis[3][x+y]=0; } } } int main(){ for(n=1;n<=10;n++){ memset(vis,0,sizeof(vis)); int ret=0; DFS(1,ret); ans =ret; } while(~scanf("%d",&n),n){ printf("%d\n",ans ); } return 0; }
相关文章推荐
- easyui删除多行问题
- 边框合并用border-collapse: collapse
- Swiper说明&&API手册
- 【Linux操作系统】Linux内核插入卸载模块
- POJ 3278 Catch That Cow
- ABP架构解析
- MySQL存储过程的异常处理方法
- js的继承
- iOS xib View宽高不能改变
- UI线程与handle
- 个人常用iOS第三方库以及XCode插件介绍
- sql语句笔记
- maven 初体验
- 053第482
- 用JAVA语言编写程序:包含两个类,一个类Cricle中包含计算圆周长,面积的方法。在另一个类Compute中给出半径值为10,创建对象,并调用Cricle类中的方法,计算该对象的面积、周长并显示出结
- 转折——新的征途
- [LeetCode][Java] Interleaving String
- Hbase优化注意事项小结
- Java Socket编程及遇到的一些问题
- 【IOS】APP瘦身,减小包大小的方法