Enumeraciones y ejercicios.

Enumeración (algoritmo exhaustivo)

La enumeración es un tipo de estrategia de resolución de problemas que intenta responder una por una, es decir, encontrar directamente la respuesta mediante circulación violenta

Ejemplo:
cubo perfecto: una ecuación de la forma a ^ 3 = b ^ 3 + c ^ 3 +10 ^ 3 se llama ecuación de cubo perfecto. Escriba un programa para un entero positivo dado N (N <= 100), encuentre todas las combinaciones para que la ecuación se mantenga, donde a, b, c, d es mayor que 1, menor o igual que N y b <= c <= d .
Según el valor de a, salida de pequeño a grande. Cuando a en las dos ecuaciones cúbicas perfectas es igual, se prioriza la salida de la pequeña b, y la salida de la pequeña c es la misma primero ...
** Idea de solución: ** Enumeración de bucle cuádruple a, b, c, d, y finalmente agrega Condiciones de juicio (resolución de violencia directa)

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  for(int a=2;a<=n;a++)
    for(int b=2;b<a;b++)
      for(int c=b;c<a;c++)
        for(int d=c;d<a;d++)
        if(a*a*a==b*b*b+c*c*c+d*d*d)
          printf("%d %d %d %d",a,b,c,d);
    return 0;
        }

Ejemplo:
ciclo fisiológico:
los días pico de la fuerza física humana, la inteligencia emocional y el coeficiente intelectual, que aparecen cada 23 días, 28 días y 33 días, respectivamente. Para todos, queremos saber cuándo caen los tres picos el mismo día. Dados los días p, e e i donde aparecen tres picos (no necesariamente el día en que aparece el primer pico), dado otro día específico d, y su tarea es generar el día d, los siguientes tres El día en que el pico cae el mismo día (indicado por la distancia d días)
Entrada:
Ingrese cuatro enteros: p, e, i y d. p, e e i representan los días en que se producen picos físicos, emocionales e intelectuales, respectivamente. d es el día dado. Puede ser menor que p, e o i. Todos los días dados no son negativos y son menores o iguales a 365, y los días solicitados son menores o iguales a 21252.
Salida:
desde el día dado, los siguientes tres días pico del mismo día (el número de días del día dado)
La idea de resolución de problemas generalmente es agregar un juicio al ciclo, entonces, ¿cómo puede ser más rápido y reducir el número de ciclos? El núcleo es el siguiente

for(k=d+1;(k-p)%23;k++)
  for(;(k-e)%28;k+=23)
    for(;(k-i)%33;k+=23*28)
      printf("%d",k-d);

Ejemplo:
Xiaoheng se enamoró recientemente del juego "Bomberman". ¿Te acuerdas del Bomberman en el juego? Usa bombas para destruir al enemigo. Es necesario eliminar a todos los enemigos en la pantalla y encontrar la puerta oculta escondida en la pared para pasar el nivel.
 Ahora hay un nivel especial de la siguiente manera. Solo tienes una bomba, pero esta bomba es súper poderosa (la distancia de muerte es demasiado larga, puedes destruir a todos los enemigos en el rango de muerte). ¿Dónde puedo poner una bomba para eliminar la mayoría de los enemigos?
Inserte la descripción de la imagen aquí
Primero modelamos este mapa. La pared se indica con #. Aquí hay dos tipos de paredes, una puede volar y la otra no puede volar. Sin embargo, dado que solo hay una bomba, todas están indicadas con # y la bomba no puede atravesar la pared. El enemigo se denota por G, y el espacio abierto se denota por. Por supuesto, la bomba solo se puede colocar en el espacio abierto.
Ingrese
13 13
#############
# GG.GGG # GGG. #
###. # G # G # G # G #
# ... # ... G #
#G #. ###. # G # G #
# GG.GGG. #. GG # #G
#. # G #. #. ###
## G ... G ... #
#G #. # G ###. # G #
# ... G # GGG.GG #
# G #. # G # G #. # G #
# GG.GGG # G.GG #
############# Salida:
8

#include<stdio.h>
int main()
{
       char a[20][21];               
       int i,j,sum,map=0,p,q,x,y,n,m;
       scanf("%d%d",&n,&m);           //n代表行,m代表列
       for(i=0;i<n;i++)
          scanf("%s",a[i]);
       for(i=0;i<n-1;i++)
       {
          for(j=0;j<m;j++) 
            {
                 if(a[i][j]=='.')     //如果是空地 
                 {
                      sum=0;                        //记录炸弹数 
                      x=i;y=j;                       //x和y记录此时的i和j 
                      while(a[x][y]!='#')        //不是墙 
                      {
                        if(a[x][y]=='G')         //是怪物 
                        sum++;x--;             //向上走 
                       }
                 x=i;y=j;
                 while(a[x][y]!='#')
                 {
                    if(a[x][y]=='G')
                       sum++;x++;          //向下走 
                   }
               x=i;y=j;
               while(a[x][y]!='#')
               {
                  if(a[x][y]=='G')
                     sum++;y--;    //向左走 
                   }
                x=i;y=j;
                while(a[x][y]!='#')
                {
                   if(a[x][y]=='G')
                       sum++;y++;    //向右走 
                  }
                  if(sum>map)  //储存最大值 
                  {  
                     map=sum;p=i;   //记录地点 
                     q=j;
                     }
                   }
                 }
              }
          printf("将炸弹放在(%d,%d)处,最多可消灭%d个敌人。\n",p,q,map);
          return 0;
}
``
10 artículos originales publicados · Me gusta2 · Visitas 217

Supongo que te gusta

Origin blog.csdn.net/dfwef24t5/article/details/104140786
Recomendado
Clasificación