Poj (3239),m皇后问题
题目链接:http://poj.org/problem?id=3239
构造法很牛逼啊,把这个搜索的题直接变成了打表。
我用dfs写了一下。
构造法公式(序列):
一、当n mod 6 != 2 或 n mod 6 != 3时:
[2,4,6,8,...,n],[1,3,5,7,...,n-1] (n为偶数)
[2,4,6,8,...,n-1],[1,3,5,7,...,n ] (n为奇数)
二、当n mod 6 == 2 或 n mod 6 == 3时
(当n为偶数,k=n/2;当n为奇数,k=(n-1)/2)
[k,k+2,k+4,...,n],[2,4,...,k-2],[k+3,k+5,...,n-1],[1,3,5,...,k+1] (k为偶数,n为偶数)
[k,k+2,k+4,...,n-1],[2,4,...,k-2],[k+3,k+5,...,n-2],[1,3,5,...,k+1],[n] (k为偶数,n为奇数)
[k,k+2,k+4,...,n-1],[1,3,5,...,k-2],[k+3,...,n],[2,4,...,k+1] (k为奇数,n为偶数)
[k,k+2,k+4,...,n-2],[1,3,5,...,k-2],[k+3,...,n-1],[2,4,...,k+1],[n ] (k为奇数,n为奇数)
这个规律我是没有搞懂的,反正很牛就是了。
我也用dfs写了一下,虽然我知道肯定会T,DFS30层就爆栈了,更何况这里是300层,就当是熟悉一下DFS了。
两种方法贴上。
- #include <stdio.h>
- #include <string.h>
- int n;
- int ans = ;
- int maps[][] = {};
- bool judge(int k,int i)
- {
- for(int j=; j<=n&&j!=i; j++)
- if(maps[k][j]==)
- return false;
- for(int j=; j<=n&&j!=k; j++)
- if(maps[j][i]==)
- return false;
- for(int j=; k+j<=n&&i+j<=n; j++)
- {
- if(maps[k+j][i+j]==)
- return false;
- }
- for(int j=; k-j>=&&i-j>=; j++)
- {
- if(maps[k-j][i-j]==)
- return false;
- }
- for(int j=; k-j>=&&i+j<=n; j++)
- {
- if(maps[k-j][i+j]==)
- return false;
- }
- for(int j=; k+j<=n&&i-j>=; j++)
- {
- if(maps[k+j][i-j]==)
- return false;
- }
- return true;
- }
- bool dfs(int k)
- {
- if(k>n)
- {
- ans ++;
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=n; j++)
- {
- if(maps[i][j])
- printf("%d",j);
- }
- }
- printf("\n");
- return true;
- }
- for(int i=; i<=n; i++)
- {
- if(judge(k,i))
- {
- maps[k][i] = ;
- if(dfs(k+))
- return true;
- maps[k][i] = ;
- }
- }
- return false;
- }
- int main()
- {
- while(scanf("%d",&n),n)
- {
- memset(maps,,sizeof(maps));
- for(int i=; i<=n; i++)
- {
- maps[][i] = ;
- if(dfs())
- break;
- maps[][i] = ;
- }
- //printf("%d\n",ans);
- }
- return ;
- }
- #include <stdio.h>
- int main()
- {
- int n;
- while(scanf("%d",&n),n)
- {
- if(n%!=&&n%!=)
- {
- if(n%==)
- {
- for(int i=;i<=n;i+=)
- printf("%d ",i);
- for(int i=;i<=n-;i+=)
- printf("%d ",i);
- printf("%d\n",n-);
- }
- else {
- for(int i=;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=n-;i+=)
- printf("%d ",i);
- printf("%d\n",n);
- }
- }
- else
- {
- if(n%==)
- {
- int k=n/;
- if(k%==)
- {
- for(int i=k;i<=n;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- for(int i=k+;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- printf("%d\n",k+);
- }
- else
- {
- for(int i=k;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- for(int i=k+;i<=n;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- printf("%d\n",k+);
- }
- }
- else
- {
- int k=(n-)/;
- if(k%==)
- {
- for(int i=k;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- for(int i=k+;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k+;i+=)
- printf("%d ",i);
- printf("%d\n",n);
- }
- else
- {
- for(int i=k;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k-;i+=)
- printf("%d ",i);
- for(int i=k+;i<=n-;i+=)
- printf("%d ",i);
- for(int i=;i<=k+;i+=)
- printf("%d ",i);
- printf("%d\n",n);
- }
- }
- }
- }
- return ;
- }
Poj (3239),m皇后问题的更多相关文章
- Poj 3239 Solution to the n Queens Puzzle
1.Link: http://poj.org/problem?id=3239 2.Content: Solution to the n Queens Puzzle Time Limit: 1000MS ...
- POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...
- [poj百练]2754:八皇后 回溯
描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...
- POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47960 Accepted: 23210 Descriptio ...
- Poj 1321 棋盘问题 【回溯、类N皇后】
id=1321" target="_blank">棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- bzoj 3239 poj 2417 BSGS
BSGS算法,预处理出ϕ(c)−−−−√内的a的幂,每次再一块一块的往上找,转移时将b乘上逆元,哈希表里O(1)查询即可 #include<cstdio> #include<cstr ...
- POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))
周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- OpenJudge/Poj 1321 棋盘问题
1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...
随机推荐
- sf01_什么是数据结构
数据结构解决什么问题 如何在计算机中存储数据和信息,采用什么样的方法和技巧加工处理这些数据,都是数据结构需要努力解决的问题. 解决问题的步骤 使用计算机解决问题的步骤:分析具体问题得到数学模型,设计解 ...
- Python Numpy Array
Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...
- RTT之内存管理及异常中断
内存管理分静态内存管理和动态内存管理(根据大小又分2种) 静态内存管理:创建.删除.初始化.解绑.申请和释放.初始化内存池是属于静态内存管理,与创建内存池不同的是,此处内存池对象所使用的内存空间是由用 ...
- maya2012安装失败如何卸载重装
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- Deferred跟promise跟js同步问题记录
之前的时候,碰到过几次同事问我,说js的同步怎么处理,就是我想先执行这段代码(耗时相对较长的一行,多数是异步的一些api调用),执行完了之后我再执行下边这句,每次我都很无奈的说不晓得,如果是ajax的 ...
- JavaScript DOM基础总结
上个月在进行百度三面时候,面试官提问JavaScript DOM方法,我回答的有点少,前面太关注JavaScript 兼容性,框架方面,JavaScript 原生DOM基础没有记牢,心中有点遗憾.下来 ...
- redis 读写锁实现
一 先搞清楚读写锁要做什么. 基本就是 读读不互斥,读写互斥,写写互斥.可重入. 关于redis读写锁,我写了一次之后,总觉得很怪,然后就上网看到大神的redisson了,果断借鉴一番. 二 读行为 ...
- avalon教程-简介
avalon是什么? avalon是一个MVVM框架, Modle-模型层,即为js中从后台接口中取出的数据,例如一个对象或者对象数组,并对这些数据进行一定的格式化.常见的返回数据是这样的{id : ...
- 多ComboBox实现复杂查询
关键是,你是要实现什么功能:是四个条件都有内容时查询,还是哪个内容有查哪个? 如果四个组合框都有内容,相对简单些: string s = "select * from 表名 where 身份 ...
- C# WinForm拖入文件到窗体,得到文件路径
private void textBox1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataForma ...