【HDU1016】 Anillo de números primos (dfs)

Problema del anillo primario

Límite de tiempo: 4000/2000 MS (Java / otros) Límite de memoria: 65536/32768 K (Java / otros)
Envío total (es): 14715 Envío (es) aceptado (s): 6720

Descripción del problema

Un anillo se compone de n círculos como se muestra en el diagrama. Ponga el número natural 1, 2,…, n en cada círculo por separado, y la suma de los números en dos círculos adyacentes debe ser un número primo.

Nota: el número del primer círculo siempre debe ser 1.

Ingrese
n (0 <n <20).

Salida
El formato de salida se muestra como ejemplo a continuación. Cada fila representa una serie de números circulares en el anillo que comienzan desde 1 en sentido horario y antihorario. El orden de los números debe cumplir los requisitos anteriores. Soluciones de impresión en orden lexicográfico.

Debe escribir un programa que complete el proceso anterior.

Imprima una línea en blanco después de cada caso.

Entrada de muestra
6 8

Ejemplo de salida
Caso 1:
1 4 3 2 5 6 1 6 5 2 3 4
Caso 2:
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

Fuente
Asia 1996,
análisis de Shanghai (China continental) :
(1) Esta pregunta es muy similar al problema de N Queen, utilizando el método de búsqueda en profundidad
(2) Aunque los requisitos de impresión se imprimen en el sentido de las agujas del reloj y en el sentido contrario, de hecho De orden de búsqueda de pequeño a grande * , los resultados después de la búsqueda coinciden con el orden de salida. *
(3) Dado que es un número dentro de 20, la forma de juzgar un número primo es golpear directamente la mesa y luego un simple bucle * para juzgar si es un número primo *
(4) La matriz de marcas en el programa es para marcar si se ha utilizado un número, la matriz Num almacena el orden de almacenamiento de * lista enlazada de números. *

Es más fácil leer las notas para la solución del problema y es inútil hacer una tabla para el juicio.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "math.h"

using namespace std;
const int maxn = 1e2;
int num[maxn];//存一个素数环的数
int T;//多长的环
int vis[maxn];//判断有没有用过这个数,0=没有。
int m_num[21];
int ans[maxn];

void printNum(){
    for( int i=1 ; i<=T-1 ; i++ ){
        printf("%d ",num[i]);
    }
    printf("%d",num[T]);
}//不想太乱

bool isprime(int n){
    if(n<2) return false;
    for( int i=2 ; i<=sqrt(n) ; i++ ){
        if(n%i==0) return false;
    }
    return true;
}//判断素数,其实打表更好

int dfs(int last,int now,int no){
    if(!isprime(last+now)) return 0;//一开始就判断,不行就退出
    num[no]=now;//行的话就把当前是找到第几次了的数放进对应下标的num里
    if(no==T&&isprime(1+num[no])){
        printNum();
        cout<<endl;
        return 1;
    }//找到要求的这么长的了,输出。
    vis[now]=1;//这个数(now)用过了,表示一下
    for(int i=2 ; i<=T ; i++)
        if(!vis[i]&&dfs(now,i,no+1)) break;//找到下一个可以的为止
        vis[now]=0;//一圈完了,数又可以用了
        return 0;
}

int main(){
    int cas=1;
    while(~scanf("%d",&T)){
        memset(vis,0,sizeof(vis));//刚开始全部的数都可以用
        num[1]=1;
        printf("Case %d:\n",cas++);
        for(int i=2 ; i<=T ; i++){
            dfs(1,i,2);
        }
        cout<<endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/thesprit/article/details/51944886
Recomendado
Clasificación