Problema del anillo principal (método de retroceso)

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.

Aporte

n (0 <n <20).

Producción

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 satisfacer 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

Salida de muestra

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

Ideas:

Retrocediendo, esto es similar al problema "n-queen".

Este algoritmo usa escaleras para describirlo visualmente: cuando te paras en un cierto nivel, juzga si has llegado al suelo (termina cuando llegas al suelo). Si no llegas al suelo, entonces considera a qué nivel quieres ir. hasta (restringido en el título). Y registre (libro), y finalmente vuelva a cero

Código de implementación:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,a[50],book[50];/*这里的a对应输出的数*/
int prime(int x)/*判断素数,是素数返回1*/
{
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)return 0;
	}
	return 1;
}
void dfs(int y)
{
	if(y==n&&prime(1+a[n-1])==1)/*判断环里面最后一个数和第一个数1的和是否为素数*/
	{
		printf("1");
		for(int i=1;i<=n-1;i++)
		{
			printf(" %d",a[i]);
		}
		printf("\n");
	}
	for(int i=2;i<=n;i++)
	{
		if(!book[i]&&prime(a[y-1]+i)==1)
		{
			a[y]=i;
			book[i]=1;
			dfs(y+1);
			book[i]=0;/*这里的最后归零很重要!!*/
		}
	} 
}
int main()
{
	int k=0;
	while(~scanf("%d",&n))
	{
		printf("Case %d:\n",++k);
		memset(book,0,sizeof(book));
		a[0]=1;
		dfs(1);
		printf("\n");	/*格式需要*/
	}
	return 0;
}

Nota: ¡Formatee! Al principio, Ajiu puso printf ("\ n"); / * formato necesita * / en printf ("Case% d: \ n", ++ k); arriba: if (k> 0) printf ("\ n "); / * Formato necesario * / Enviar, Error de presentación. Así que presta atención al formato QQ

Suplemento: función para determinar números primos (más eficiente)

int is_prime (int x)

{     para (int i = 2; i * i <= x; i ++)     if (x% i == 0) return 0;     return 1; }



 

Supongo que te gusta

Origin blog.csdn.net/with_wine/article/details/113954109
Recomendado
Clasificación