题目链接: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 ;
}

最新文章

  1. zend studio 使用总结
  2. 无线安全专题01--kali破解WPA
  3. 安卓App和java通信实例
  4. 对于fmri的设计矩阵构造的一个很直观的解释-by 西南大学xulei教授
  5. socket通信简单介绍
  6. Ubuntu 学习笔记
  7. linux之Apache
  8. 《javascript dom编程艺术》笔记(二)——美术馆示例
  9. Jquery调用webService的四种方法 转载-记录
  10. 使用Iterator的方式也可以顺利删除和遍历
  11. Quart.Net分布式任务管理平台
  12. 【Homework】LCA&amp;RMQ
  13. 【Convex Optimization (by Boyd) 学习笔记】Chapter 1 - Mathematical Optimization
  14. 四、Python导入自己写的包报错:没有该包如何解决
  15. 微信小程序一些demo链接地址
  16. Java面向对象的三大特性之一 多态
  17. css改变input显示的样式
  18. ace -- about
  19. NewStyleClass学习笔记[一]
  20. 【校招面试 之 C/C++】第20题 C++ STL(二)之Vector

热门文章

  1. 搭建一个wordpress网站需要做哪些工作
  2. spring @Transactional事务失效
  3. java——第十二章 异常处理和文本I/O
  4. Problem03 水仙花数
  5. java——平衡二叉树 AVLTree、AVLMap、AVLSet
  6. sqlserver 2012 部署详解
  7. javassist fr8.0破解
  8. Java基本语法_循环练习系列(一)——模拟双色球
  9. Murano Weekly Meeting 2016.06.07
  10. (转)blkid命令 获取文件系统类型、UUID