CF D

 avatar
unknown
c_cpp
19 days ago
2.7 kB
2
Indexable
#include <cstdio>

const int	SIZE		= 1001;

int	n_TotCase;
int	n_SizeX;
int	n_SizeY;
int	n_Ans;
int	n_Cnt;
int	n_First[3];
int	n_Map[SIZE][SIZE];
int	n_CheckNum;

bool		Out_of_Range(int n_PosX, int n_PosY, int n_Range);

int main()
{
	scanf("%d", &n_TotCase);

	while (n_TotCase--)
	{
		scanf("%d %d", &n_SizeX, &n_SizeY);

		for (int i = 1; i <= n_SizeX; i++)
		{
			for (int j = 1; j <= n_SizeY; j++)
			{
				scanf("%1d", &n_Map[i][j]);
			}
		}

		int	n_PosX	= 1;
		int	n_PosY	= 1;
		n_Ans		= 0;
		
		int	n_Min	= n_SizeX > n_SizeY ? n_SizeY : n_SizeX;

		n_Min		>>= 1;

		for (int i = 1; i <= n_Min; i++)
		{
			n_PosX		= i;
			n_PosY		= i;
			n_CheckNum	= 0;
			n_Cnt		= 0;

			while (!Out_of_Range(n_PosX, n_PosY, i))
			{
				n_CheckNum	= (n_CheckNum * 10 + n_Map[n_PosX][n_PosY]) % 10000;
				
				if (n_CheckNum == 1543)
				{
					n_Ans++;
				}

				if (n_Cnt < 3)
				{
					n_First[n_Cnt]	= n_Map[n_PosX][n_PosY];
				}

				n_Cnt++;
				n_PosY++;
			}

			n_PosY--;

			while (!Out_of_Range(n_PosX, n_PosY, i))
			{
				if (n_PosX == i)
				{
					n_PosX++;
				}
				
				n_CheckNum	= (n_CheckNum * 10 + n_Map[n_PosX][n_PosY]) % 10000;
				
				if (n_CheckNum == 1543)
				{
					n_Ans++;
				}

				if (n_Cnt < 3)
				{
					n_First[n_Cnt]	= n_Map[n_PosX][n_PosY];
				}

				n_Cnt++;
				n_PosX++;
			}

			n_PosX--;

			while (!Out_of_Range(n_PosX, n_PosY, i))
			{
				if (n_PosY == n_SizeY + 1 - i)
				{
					n_PosY--;
				}
				n_CheckNum	= (n_CheckNum * 10 + n_Map[n_PosX][n_PosY]) % 10000;
				
				if (n_CheckNum == 1543)
				{
					n_Ans++;
				}

				if (n_Cnt < 3)
				{
					n_First[n_Cnt]	= n_Map[n_PosX][n_PosY];
				}

				n_Cnt++;
				n_PosY--;
			}

			n_PosY++;

			while (!Out_of_Range(n_PosX, n_PosY, i) && n_PosX != i)
			{
				if (n_PosX == n_SizeX + 1 - i)
				{
					n_PosX--;
					
					if (n_PosX == i)
					{
						break;
					}
				}
				
				n_CheckNum	= (n_CheckNum * 10 + n_Map[n_PosX][n_PosY]) % 10000;
				
				if (n_CheckNum == 1543)
				{
					n_Ans++;
				}

				if (n_Cnt < 3)
				{
					n_First[n_Cnt]	= n_Map[n_PosX][n_PosY];
				}

				n_Cnt++;
				n_PosX--;
			}

			for (int j = 0; j < 3; j++)
			{
					n_CheckNum	= (n_CheckNum * 10 + n_First[j]) % 10000;
					
					if (n_CheckNum == 1543)
					{
						n_Ans++;
					}
			}
		}

		printf("%d\n", n_Ans);
	}

	return 0;
}

bool	Out_of_Range(int n_PosX, int n_PosY, int n_Range)
{
	if (n_PosX < n_Range || n_PosY < n_Range)
	{
		return true;
	}

	if ((n_PosX > n_SizeX - n_Range + 1) || (n_PosY > n_SizeY - n_Range + 1))
	{
		return true;
	}

	return false;
}
Editor is loading...
Leave a Comment