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.