DFS专练

一、N皇后问题

问题描述:

在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n的棋盘上放置n个皇后,任何2个皇后不能在同一行或同一列或同一斜线上。


思路:

要解决N皇后问题,其实就是要解决好怎么放置这n个皇后,每一个皇后与前面的所有皇后不能在同一行、同一列、同一对角线,我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。此即是回溯法的精髓所在。当第n个皇后放置成功后,即得到一个可行解,此时再回到上一个皇后重新放置寻找下一个可行解...如此后,即可找出一个n皇后问题的所有可行解。

代码:

#include
#include
int n;
int sum=0;
int a[20];   //表示放置皇后的列数
int check(int k)
{
    int i;
    for(i=0;i
二、素数环问题(HDU 1016)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

问题描述:

给定一个数n,有1到n共n个自然数,使这n个自然数组成一个环,要求环中相邻两个数之和为素数,求能够组成这种环的所有情况。

比如n=8,满足条件的素数环有:

1 2 3 8 5 6 7 4

1 2 5 8 3 4 7 6

1 4 7 6 5 8 3 2

1 6 7 4 3 8 5 2

共4种可能。


思路:

对每一个位置的数进行循环遍历,每次都把1到n搜索一遍,符合条件就填进去(记录下来),扫描下一个位置的数字,不符合条件的就跳过。


代码:

#include 
#include 
int flag[30];    //标记已经选过的数,1为选,0为未选。
int a[100];      //存放自然数
int n;
int check(int x)   //判断是否为素数
{
    int i;
    for(i=2;i



你可能感兴趣的:(算法)