HDU 2553 N皇后问题
2014-08-06 11:36
204 查看
算法就是明白了感觉很简单,不理解就感觉那些代码是天书。
第一次接触N皇后问题是在我们的C++教材上,感觉挺困难的。我们教材上给了八皇后的代码,尼玛,就是一个八重循环。
好了,回到正题
vis数组就是保存了三个方向是否会发生冲突,如果有冲突则不再搜索。
因为我们是逐行搜索,所以不会出现一行上有两个皇后的问题。
主对角线上的规律就是,每条线上的行和列的差为定值;
副对角线是行和列的和为定值。
这样就很容易理解代码中 vis[1][col + row] 和 vis[2][n - col + row]的含义了,分别代表副对角线和主对角线
关于超时,由于输入数据比较多,所以打表是个不错的选择。
另外,这里有一篇很详细的文章讲用位运算来代替vis数组,马克,以后再看!
代码君
第一次接触N皇后问题是在我们的C++教材上,感觉挺困难的。我们教材上给了八皇后的代码,尼玛,就是一个八重循环。
好了,回到正题
vis数组就是保存了三个方向是否会发生冲突,如果有冲突则不再搜索。
因为我们是逐行搜索,所以不会出现一行上有两个皇后的问题。
主对角线上的规律就是,每条线上的行和列的差为定值;
副对角线是行和列的和为定值。
这样就很容易理解代码中 vis[1][col + row] 和 vis[2][n - col + row]的含义了,分别代表副对角线和主对角线
关于超时,由于输入数据比较多,所以打表是个不错的选择。
另外,这里有一篇很详细的文章讲用位运算来代替vis数组,马克,以后再看!
http://www.cnblogs.com/gj-Acit/archive/2013/08/04/3236148.html
//#define LOCAL #include <iostream> #include <cstdio> #include <cstring> using namespace std; int cnt, n, vis[3][25]; int ans[12]; void DFS(int row) { if(row == n) { ++cnt; return; } for(int col = 0; col < n; ++col) { if(!(vis[0][col] || vis[1][col + row] || vis[2][n - col + row])) { vis[0][col] = vis[1][col + row] = vis[2][n - col + row] = 1; DFS(row + 1); vis[0][col] = vis[1][col + row] = vis[2][n - col + row] = 0; } } } void Init() { for(n = 1; n <= 10; ++n) { cnt = 0; memset(vis, 0, sizeof(vis)); DFS(0); ans = cnt; } } int main(void) { #ifdef LOCAL freopen("2553in.txt", "r", stdin); #endif Init(); int num; while(scanf("%d", &num) && num) printf("%d\n", ans[num]); return 0; }
代码君
相关文章推荐
- HDU 2553 N皇后问题
- HDU 2553 N皇后问题(深搜)
- HDU 2553 N皇后问题(DFS+打表)
- HDU 2553 N皇后问题 深搜
- HDOJ/HDU 2553 N皇后问题 回溯加递归
- hdu 2553 N皇后问题
- HDU 2553 N皇后问题 深搜-dfs
- HDU-2553-N皇后问题
- hdu 2553 N皇后问题 (简单版_递归)
- hdu 2553 N皇后问题(深度递归搜索)
- HDU 2553 N皇后问题
- HDU 2553-N皇后问题
- HDU 2553-N皇后问题
- HDU-2553-N皇后问题
- Hdu 2553 N皇后问题
- HDU 2553 N皇后问题
- hdu 2553 N皇后问题----搜索 dfs 回溯法 预处理
- [HDU] 2553 N皇后问题-简单深搜
- HDU_2553——n皇后问题,作弊
- hdu 2553 N皇后问题<java>