[水+dfs] poj 2034 Anti-prime Sequences

题意:

给n,m,k。

排列n~m之间的所有数。

保证相邻的2~k位之和均不为素数。

思路:

直接DFS。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#include"stack"
#include"vector"
#define ll __int64
#define inf -999999999999999999LL
using namespace std;
#define MAXN 100007
bool mark[MAXN];
int ss[MAXN/3],sscnt;
int n,m,d,f;
int sum[1234],a[1234],used[1234];
void ssb()
{
    sscnt=0;
    memset(mark,false,sizeof(mark));
    mark[0]=mark[1]=true;
    for(int i=2; i<=MAXN; i++)
    {
        if(!mark[i])
        {
            for(int j=i+i; j<=MAXN; j+=i) mark[j]=true;
            ss[sscnt++]=i;
        }
    }
    return ;
}
void dfs(int x)
{
    if(f) return;
    if(x>m-n+1)
    {
        f=1;
        return ;
    }
    for(int i=n;i<=m;i++)
    {
        if(!used[i])
        {
            int kx=1;
            for(int j=2;j<=d && x-j>=0;j++)
            {
                if(mark[sum[x-1]-sum[x-j]+i]==false) kx=0;
            }
            if(!kx) continue;
            sum[x]=sum[x-1]+i;
            a[x]=i;
            used[i]=1;
            dfs(x+1);
            if(f) return;
            used[i]=0;
        }
    }
}
int main()
{
    ssb();
    while(scanf("%d%d%d",&n,&m,&d),(n+m+d))
    {
        f=0;
        memset(sum,0,sizeof(sum));
        memset(used,0,sizeof(used));
        dfs(1);
        if(!f) puts("No anti-prime sequence exists.");
        else  for(int i=1;i<=m-n+1;i++) printf(i==m-n+1?"%d\n":"%d,",a[i]);
    }
    return 0;
}
时间: 2024-10-10 08:38:09

[水+dfs] poj 2034 Anti-prime Sequences的相关文章

(水 dfs) poj 3740

Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16854   Accepted: 4567 Description Given a M×N matrix A. Aij ∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.

dfs/poj 2488 A Knight&#39;s Journey

1 #include<cstdio> 2 using namespace std; 3 const int b[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; 4 int a[30][30],p,q; 5 struct 6 { 7 int x,y; 8 }step[910]; 9 10 bool dfs(int x,int y,int now) 11 { 12 if (now==p*q) return true;

【dfs】hdu 1016 Prime Ring Problem

[dfs]hdu 1016 Prime Ring Problem 题目链接 刚开始接触搜索,先来一道基本题目练练手. 注意对树的深度进行dfs dfs过程中注意回退!!! 素数提前打表判断快一些 参考代码 /*Author:Hacker_vision*/ #include<bits/stdc++.h> #define clr(k,v) memset(k,v,sizeof(k)) using namespace std; const int _max=1e3+10;//素数打表 int n,pr

POJ 2560 Freckles Prime算法题解

本题是求最小生成树. 给出的是坐标节点,然后需要根据这些坐标计算出各个点之间的距离. 除此就是标准的Prime算法了,能使用Prime的基本上都可以使用Kruskal. 这些经典的算法一定要多写,熟练掌握,否则很难灵活运用的. 而且经典的算法之所以为经典,原因之一是没那么容易自己凭空想象出来的,所以要熟练. #include <stdio.h> #include <string.h> #include <queue> #include <float.h> #

DFS POJ 3087 Shuffle&#39;m Up

题目传送门 1 /* 2 题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子 3 DFS:直接模拟搜索,用map记录该字符串是否被搜过.读懂题目是关键. 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-3 13:57:55 8 File Name :POJ_3087.cpp 9 *****

搜索 || DFS || POJ 2488 A Knight&#39;s Journey

给一个矩形棋盘,每次走日字,问能否不重复的走完棋盘的每个点,并将路径按字典序输出 *解法:按字典序输出路径,因此方向向量的数组按字典序写顺序,dfs+回溯,注意flag退出递归的判断,并且用pre记录路径 #include <iostream> #include <cstdio> #include <cstring> using namespace std; char a[30][30]; int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};

poj 2034 Anti-prime Sequences(dfs)

//相邻的 2.3......d 之和都要不为素数 # include <algorithm> # include <stdio.h> using namespace std; int num[1010],vis[1010]; int n,m,d,cot; int flag[10010]; void init()//素数打表 { int i,j; for(i=2;i<10010;i++) { if(!flag[i]) for(j=i*i;j<10010;j=j+i) f

[ tarjan + dfs ] poj 2762 Going from u to v or from v to u?

题目链接: http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14546   Accepted: 3837 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cav

HDU 4707 水DFS

所有房子组成一颗树,求出离根节点0的距离大于d的节点数目 DFS+vector存边 水过 #include "stdio.h" #include "string.h" #include "vector" using namespace std; vector<int>mapp[100010]; int ans,d; void dfs(int cur,int pre,int op) { int i; for (i=0;i<mapp