Problem:
Score : 200 points

Problem Statement

We have a bingo card with a 3\times3 grid. The square at the i-th row from the top and the j-th column from the left contains the number A_{i, j}.

The MC will choose N numbers, b_1, b_2, \cdots, b_N. If our bingo sheet contains some of those numbers, we will mark them on our sheet.

Determine whether we will have a bingo when the N numbers are chosen, that is, the sheet will contain three marked numbers in a row, column, or diagonal.

Constraints

All values in input are integers.

1 \leq A_{i, j} \leq 100

A_{i_1, j_1} \neq A_{i_2, j_2} ((i_1, j_1) \neq (i_2, j_2))

1 \leq N \leq 10

1 \leq b_i \leq 100

b_i \neq b_j (i \neq j)

Input

Input is given from Standard Input in the following format:

A_{1, 1} A_{1, 2} A_{1, 3}
A_{2, 1} A_{2, 2} A_{2, 3}
A_{3, 1} A_{3, 2} A_{3, 3}
N
b_1
\vdots
b_N

Output

If we will have a bingo, print Yes; otherwise, print No.

Sample Input 1

84 97 66
79 89 11
61 59 7
7
89
7
87
79
24
84
30

Sample Output 1

Yes

We will mark A_{1, 1}, A_{2, 1}, A_{2, 2}, A_{3, 3}, and complete the diagonal from the top-left to the bottom-right.

Sample Input 2

41 7 46
26 89 2
78 92 8
5
6
45
16
57
17

Sample Output 2

No

We will mark nothing.

Sample Input 3

60 88 34
92 41 43
65 73 48
10
60
43
88
11
48
73
65
41
92
34

Sample Output 3

Yes

We will mark all the squares.

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>

typedef struct t_bingo{
	int		j;
	int		k;
	struct t_bingo *next;
}		t_bingo;

t_bingo		*create_entry(int j, int k)
{
	t_bingo		*p;

	p = (t_bingo *)malloc(sizeof(t_bingo));
	if (!p)
		return (0);
	else
	{
		p->j = j;
		p->k = k;
		p->next = NULL;
	}
	return (p);
}

int		is_diagnol(int *nbrs)
{
	int		i;
	int		flag;
	int		same1, same2, diff1, diff2;

	i = 0;
	flag = 0;
	while (nbrs[i])
	{
		if (nbrs[i] == 2 && nbrs[i + 1] == 2)
			flag = 1;
		if (nbrs[i] == 1 && nbrs[i + 1] == 1)
			same1 = 1;
		if (nbrs[i] == 3 && nbrs[i + 1] == 3)
			same2 = 1;
		if (nbrs[i] == 1 && nbrs[i + 1] == 3)
			diff1 = 1;
		if (nbrs[i] == 3 && nbrs[i + 1] == 1)
			diff2 = 1;
		i += 2;
	}
	if (flag == 1 || (same1 == 1 && same2 ==1) || (diff1 == 1 && diff2 == 1))
		return (1);
	return (0);
}

int		is_bingo(t_bingo *p, int count)
{
	int		*nbrs;
	int		i;
	int		a, b, c;

	i = 0;
	nbrs = (int *)malloc(sizeof(int) * (count * 2 + 1));
	while (p)
	{
		nbrs[i] = p->j;
		nbrs[i + 1] = p->k;
		i += 2;
		p = p->next;
	}
	nbrs[i] = 0;
	i = 0;
	while (i < (count * 2))
	{
		if (nbrs[i] == 1)
			a++;
		else if (nbrs[i] == 2)
			b++;
		else if (nbrs[i] == 3)
			c++;
		i += 2;
	}
	if (a >= 3 || b >= 3 || c >= 3)
		return (1);
	a = 0;
	b = 0;
	c = 0;
	i = 1;
	while (i < (count * 2))
	{
		if (nbrs[i] == 1)
			a++;
		else if (nbrs[i] == 2)
			b++;
		else if (nbrs[i] == 3)
			c++;
		i += 2;
	}
	if (a >= 3 || b >= 3 || c >= 3 || is_diagnol(nbrs))
		return (1);
	return (0);
}

int		main()
{
	t_bingo		*p;
	t_bingo		*new;
	int		bingo[3][3];
	int		N, n, count;
	int		i = 0;

	count = 0;
	while (i < 3)
	{
		scanf("%d %d %d\n", &bingo[i][0], &bingo[i][1], &bingo[i][2]);
		i++;
	}
	scanf("%d\n", &N);
	for (i = 0; i < N; i++)
	{
		scanf("%d\n", &n);
		for (int j = 0; j < 3; j++)
		{
			for(int k = 0; k < 3; k++)
			{
				if (n == bingo[j][k])
				{
					new = create_entry(j + 1, k + 1);
					if (count)
						new->next = p;
					p = new;
					count++;
				}
			}
		}
	}
	if (count >= 3 && is_bingo(p, count))
		printf("Yes\n");
	else
		printf("No\n");
	return (0);
}