题目链接: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皇后问题的更多相关文章

  1. 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 ...

  2. POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...

  3. [poj百练]2754:八皇后 回溯

    描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...

  4. POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Descriptio ...

  5. Poj 1321 棋盘问题 【回溯、类N皇后】

    id=1321" target="_blank">棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  6. bzoj 3239 poj 2417 BSGS

    BSGS算法,预处理出ϕ(c)−−−−√内的a的幂,每次再一块一块的往上找,转移时将b乘上逆元,哈希表里O(1)查询即可 #include<cstdio> #include<cstr ...

  7. POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))

    周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. OpenJudge/Poj 1321 棋盘问题

    1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...

随机推荐

  1. 缓冲区 粘包 029 send 和sendall 的区别 find 和 findall 的区别

    一.tcp : 属于长连接 与客户端连接了之后 其他客户端需要等待 要连接另外一个 必须优雅的断开前面这个客户的连接. 二.缓冲区 :为了避免网络传输信号不通畅而是程序一直停留在消息发送状态而不向下进 ...

  2. SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape错误原因及解决方法

    用Python打开文件: with open('C:\Users\PINPIN\test\file1.txt','r') as f2: pass 运行后直接就报错了: File "<i ...

  3. 关于element-ui表格样式设置的方法cell-class-name

    关于element-ui表格使用的一些方法 最近在用Vue.js和elment-ui做一个后台管理项目,不得不说element功能非常强大,提供了许多组件,基本可以满足一些基础的开发了.因为我做的后台 ...

  4. Python Numpy Array

    Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array   dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...

  5. SQL Server覆盖索引--有无包含列对数据库查询性能的影响分析

    “覆盖索引使您能够避免返回到表中以满足请求的所有列,因为所有请求的列都已经存在于非聚集索引中.这意味着您还可以避免返回到表中进行任何逻辑或物理的信息读取.” 然而,以上这不是我想要传达的全部意思,因为 ...

  6. shell查看内存

    <1>jps<2>ps<3>free<4>df<5>top jps: 很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jp ...

  7. Redis Intro - Skiplist

    http://zhangtielei.com/posts/blog-redis-skiplist.html https://juejin.im/entry/59197a390ce4630069fbcf ...

  8. maya2018无法安装卸载激活失败

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  9. Murano Weekly Meeting 2016.05.31

    Meeting time: 2016.May.31 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1.A ...

  10. Spring boot-(3) Spring Boot特性1

    本节将深入Spring Boot的细节,可以学到你想使用的或定制的Spring Boot的主要特性. 1. SpringApplication SpringApplication类为引导一个Sprin ...