题目链接: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. 更新jdk

    1.从官网下载jdk-8u191-linux-x64.tar.gz,然后放在ubuntu里的Downloads文件夹里.然后解压到/usr/lib/jvm文件夹中. sudo tar -zxvf Do ...

  2. junit使用中的一些问题

    之前开发过程中的测试,不是使用main方法,就是启动项目调用地址,尤其是后者,测试起来非常不方便,今天配置了下junit,中间遇到些问题,记录如下. 首先下载spring-test.jar包和juni ...

  3. Spring---数据缓存(未完待续)

    1.为什么需要数据缓存? 程序的瓶颈大都在数据库,而内存的速度是远远大于硬盘的,当我们需要重复读取相同数据时,一次又一次的请求数据库或者远程服务,导致大量的时间浪费在数据库或者 远程服务上,导致程序性 ...

  4. html-3

    <hr> 下划线实体:想在页面显示被浏览器解析的内容为表格添加标题<caption>跟tr同级,只在<table>下 <link> 为页面加小图标 在& ...

  5. DexClassLoader和PathClassLoader

    Android的ClassLoader体系 在Android中可以跟java一样实现动态加载jar,但是Android使用Dalvik VM,不能直接加载java打包jar的byte code,需要通 ...

  6. SETI ACdream - 1430 后缀自动机求不相交子串

    http://blog.csdn.net/gatevin/article/details/45875343 题目是求不重叠的不同子串个数 一般来说, endpos集合包含了子串结尾位置,结尾在&quo ...

  7. bootstrap3-dialog:更强大、更灵活的模态框(封装好的模态框)

    用过bootstrap框架的同学们都知道,bootstrap自带的模态框用起来很不灵活,可谓鸡肋的很.但nakupanda开源作者封装了一个更强大.更灵活的模态框——bootstrap3-dialog ...

  8. ThreadPoolExecutor的三种队列SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue

    SynchronousQueue SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加:可以认为Sync ...

  9. compile with -fPIC

    在新公司工作第四天,依然要编译FFmpeg,不同的是难度大了,以前遇到什么参数编译不过的,就去掉,因为不是专业做视频的,但是新公司绕不过了. 编译FFmpeg动态库的时候发现链接某些静态库的时候会报错 ...

  10. SQL Server 创建用户

    增加角色 role_for_nc 1.exec sp_addrole 'role_for_nc'; 创建一个 SQL Server 登录名wlzx,密码为"123",默认数据库为 ...