Solución a la Tarea 6: Peones atorados

Verificar si un peón está atorado o no puede llegar a ser ligeramente complicado. Por ello, escribimos una función que verifique si un peón negro está atorado y otra función que verifique si un peón blanco está atorado. Cada una de ellas tiene cuatro casos: (1) el peón está ya en el último renglón, (2) el peón está en la columna izquierda, (3) el peón está en la columna derecha y (4) ninguna de las anteriores. En el caso (1) no hay nada que revisar, en los casos (2) y (3) sólo debemos revisar hacia adelante y hacia un lado, mientras que en el caso (4) debemos revisar hacia adelante y hacia los dos lados. Con estas dos funciones, el resto del programa sólo consiste en leer el tablero y revisar cada una de las casillas:

#include <stdio.h>
 
#define N 100
 
int negro(int n, int x, int y, int t[N][N])
{
  if (y == 0)
    return 1;
  if (x == 0)
    return (t[x][y-1] != 0) && (t[x+1][y-1] != 2);
  if (x == n-1)
    return (t[x][y-1] != 0) && (t[x-1][y-1] != 2);
  return (t[x][y-1] != 0) && (t[x+1][y-1] != 2) && (t[x-1][y-1] != 2);
}
 
int blanco(int n, int x, int y, int t[N][N])
{
  if (y == n-1)
    return 1;
  if (x == 0)
    return (t[x][y+1] != 0) && (t[x+1][y+1] != 1);
  if (x == n-1)
    return (t[x][y+1] != 0) && (t[x-1][y+1] != 1);
  return (t[x][y+1] != 0) && (t[x+1][y+1] != 1) && (t[x-1][y+1] != 1);
}
 
int main(void)
{
  int i, j, n, p = 0, q = 0;
  int t[N][N];
 
  scanf("%d", &n);
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      scanf("%d", &t[j][i]);
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      switch (t[j][i]) {
        case 1:
          p += negro(n, j, i, t);
          break;
        case 2:
          q += blanco(n, j, i, t);
          break;
      }
  printf("%d %d\n", p, q);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

4
2 1 0 0
1 0 2 2
0 0 1 0
0 0 1 0
3
0 1 2
1 2 0
1 2 0
3
1 0 2
0 1 0
2 0 1
3
0 1 0
2 0 1
0 2 0
3
0 0 0
0 0 0
0 0 0
3 2
1 1
1 1
1 1
0 0
3
1 2 1
0 0 0
2 1 2
5
0 1 2 0 1
2 0 1 2 0
1 2 0 1 2
0 1 2 0 1
2 0 1 2 0
7
0 0 0 0 0 0 0
0 0 1 2 0 1 0
0 2 0 1 2 0 0
0 1 2 0 1 2 0
0 0 1 2 0 1 0
0 2 0 1 2 0 0
0 0 0 0 0 0 0
7
1 0 2 0 1 2 0
0 1 2 0 1 2 0
0 2 0 1 0 2 2
1 2 0 1 2 1 1
1 0 2 0 1 2 0
2 1 0 2 1 0 1
1 2 0 1 2 0 1
10
0 1 2 1 0 2 1 0 0 0
1 0 2 0 1 2 0 0 1 0
0 1 2 0 1 2 0 1 2 1
0 2 0 1 0 2 2 1 2 0
1 2 0 1 2 1 1 0 0 0
1 0 2 0 1 2 0 1 2 0
2 1 0 2 1 0 1 0 0 1
1 2 0 1 2 0 1 0 1 2
1 1 2 0 1 2 1 0 2 0
1 2 0 1 0 2 0 1 0 0
2 2
8 8
6 6
7 6
12 9


Para probar su tarea en UNIX, escriban la instrucción gcc peonesNN.c -o peones para compilar su programa, y la instrucción ./peones para correrlo. Algunos errores comúnes fueron: (a) No darse cuenta de que en realidad hay cuatro casos para cada color de los peones. (b) Revisar hacia adelante cuando no se debe. (c) Revisar en diagonal cuando no se debe. (d) No revisar el color del peón que se pretende comer.