Cómo resolver este algoritmo (estrategia óptima)

Envié una edición a sus detalles que, creo, aclara su pregunta. El “1” elegido por A debe ser “-1”.

Entonces, si leo el juego correctamente, dos jugadores se turnan para seleccionar

  • El primer número en el conjunto, o
  • El último número en el conjunto, o
  • Los dos primeros números del conjunto, o
  • Los dos últimos números del conjunto.

El objetivo es ser el jugador con la suma más alta cuando se consumen todos los números.

De esto, se deduce que sus jugadores A y B tomaron los siguientes turnos:

  1. A escogió el último número del conjunto, -1 [si la corrección es … correcta], por una suma de 9.
  2. B eligió los dos últimos números del conjunto, 6 y 3, por una suma de 9.
  3. A escogió el último número del conjunto, 5, por una suma de 4.
  4. B toma el último número restante, -11, por una suma de -2.
  5. A gana.

Realmente no hay mucho en el “algoritmo”. El juego consiste en que dos jugadores se turnan para elegir los números de un conjunto de números. El algoritmo es que la suma de cada jugador se acumula en el conjunto de turnos. El juego termina simplemente cuando el conjunto de números está agotado.

Para hacer eso en C, simplemente necesitarías:

  • Un conjunto de enteros [¿quizás incluso una entrada basada en un tamaño variable del usuario?]. Rellena esto al azar con enteros positivos / negativos.
  • Una suma entera para cada jugador.
  • Una función de visualización que muestra el conjunto actual de números disponibles para elegir, ordenados de la manera que es obvio para los jugadores cuál es el primero / el último.
  • Una función de entrada que permite a los jugadores seleccionar uno de los cuatro movimientos posibles.
  • Una función de ‘algoritmo’ que extrae los números seleccionados del jugador de la matriz y los agrega a la suma de los jugadores.

En codigo:

#include
#include
#include

// uso: game

int setSize = 0;
int * set = NULL;
int * workingSet = NULL;
int jugadores = 0;
int * playerSum = NULL;
int techo = 0;

void displaySet ()
{
int i;
printf (“conjunto actual: \ n”);
para (i = 0; i <setSize; i ++)
{
printf (“% d \ n”, workingSet [i]);
}
}

void displayStats ()
{
int i;
printf (“estadísticas actuales: \ n”);
para (i = 0; i <jugadores; i ++)
{
printf (“% d:% d \ n”, i, playerSum [i]);
}
}

void playerPick (int jugador)
{
int c;

para (;;)
{
printf (“pick 1) first, 2) first two, 3) last two o 4) last: \ n”);
c = fgetc (stdin);
if (c> = ‘1’ && c <= '4')
{
rotura;
}
}

si (c ‘4’)
{
printf (“bomba aquí porque simplemente no me importa … \ n”);
salida (-2);
}
si (c == ‘1’)
{
playerSum [jugador] + = workingSet [0];
// ‘liberar’ el primer número
workingSet ++;
setSize–;
}
más si (c == ‘2’)
{
playerSum [jugador] + = workingSet [0];
playerSum [jugador] + = workingSet [1];
// ‘liberar’ los dos primeros números
workingSet + = 2;
setSize – = 2;
}
si no (c == ‘3’)
{
playerSum [jugador] + = workingSet [setSize-1];
playerSum [jugador] + = workingSet [setSize-2];
// ‘liberar’ los dos últimos números
setSize – = 2;
}
más si (c == ‘4’)
{
playerSum [jugador] + = workingSet [setSize-1];
// ‘liberar’ el último número
setSize–;
}
}

int main (int argc, char ** argv)
{
int currentPlayer = 0;
tiempo_t t;
int i;

si (argc! = 4)
{
printf (“uso: game \ n”);
volver -1;
}
jugadores = atoi (argv [1]);
setSize = atoi (argv [2]);
techo = atoi (argv [3]);
if (jugadores && setSize && ceiling)
{
playerSum = calloc (players, sizeof (int));
set = calloc (setSize, sizeof (int));
if (playerSum && set)
{
srand ((sin signo) tiempo (& t));
para (i = 0; i <setSize; i ++)
{
set [i] = (rand ()% (techo * 2)) – techo;
}

workingSet = set;

hacer
{
displaySet ();
playerPick (jugador actual);
displayStats ();
currentPlayer ++;
currentPlayer% = jugadores;
} while (setSize> 0);
}
}
más
{
printf (“los jugadores deben ser> 0, el tamaño del set debe ser> 0 y el techo debe ser> 0 \ n”);
volver -1;
}
devuelve 0;
}

Soy A. ¿Cuánto puedo anotar? Digamos que de mis 4 opciones elijo la opción # 1. Luego puntuaré lo que quede en la secuencia, menos lo que B puntúe. ¿Cuánto puntajes B? Suena como una recursión fácil para mí.

dejar entrada = [| -11; 5; 3; 6; -1 |]
deja que rec puntúe lr =
dejar rango = r – l + 1
si rango = 0 entonces 0
más
dejar rebanada = entrada. [l..r]
si rango <= 2 entonces
let positive = slice |> Seq.filter ((<) 0) |> Seq.sum
si es positivo> 0, entonces positivo más rebanada |> Seq.max
más
dejar a oponentOptions =
[| puntuación (l + 1) r
puntuación (l + 2) r
puntaje l (r-1)
puntuación l (r-2) |]
(rebanada |> Seq.sum) – (oponentOptions |> Seq.min)

No ha proporcionado ningún algoritmo, solo un par de reglas y un ejemplo (que no parece ajustarse a las reglas). Un algoritmo es una descripción de cómo resolver un problema. Una vez que tiene un algoritmo, es bastante sencillo implementarlo en un lenguaje como C.