ACdream 暴力專場B

思路:

只有一個方向,就不需要遞歸了,假如遞歸就會RE;

另外需要標記這個點某個方向是否走過

以及被消滅了就不能再被消滅.

三點注意了就可以過了.'

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int Div[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 };
int ans;
char map[1100][1100];
bool vis[1100][1100][4];
bool vis2[1100][1100];
int n, m;
bool check(int x, int y)
{
	if (x<1 || x>n || y<1 || y>m || map[x][y] == '*')
		return false;
	return true;
}
void dfs(int x, int y, int d, int cnt)
{
	bool flag = false;
	while (1)
	{
		flag = false;
		ans = max(ans, cnt);
		if (map[x][y] == '\\')
		{
			if (d == 0)
				d = 1;
			else
			if (d == 1)
				d = 0;
			else
			if (d == 2)
				d = 3;
			else
				d = 2;
		}
		if (map[x][y] == '/')
		{
			if (d == 0)
				d = 3;
			else
			if (d == 1)
				d = 2;
			else
			if (d == 2)
				d = 1;
			else
				d = 0;
		}
		int xx = x + Div[d][0];
		int yy = y + Div[d][1];
		if (check(xx, yy) && !vis[xx][yy][d])
		{
			if (map[xx][yy] == 'E'&&!vis2[xx][yy])
			{
				vis2[xx][yy] = 1;
				cnt++;
			}
			vis[xx][yy][d] = 1;
			flag = true;
			x = xx;
			y = yy;
		}
		if (!flag)
			break;
	}
}
int main()
{
	while (~scanf("%d%d", &n, &m))
	{
		int sx = -1, sy = -1;
		for (int i = 1; i <= n; i++)
		{
			scanf("%s", map[i] + 1);
			for (int j = 1; j <= m; j++)
			if (map[i][j] == 'T')
			{
				sx = i;
				sy = j;
			}
		}
		ans = 0;
		if (sx != -1)
		for (int i = 0; i < 4; i++)
		{
			int x = sx + Div[i][0];
			int y = sy + Div[i][1];
			if (check(x, y))
			{
				memset(vis, 0, sizeof vis);
				memset(vis2, 0, sizeof vis2);
				vis[x][y][i] = 1;
				if (map[x][y] == 'E')
				{
					vis2[x][y] = 1;
					dfs(x, y, i, 1);
				}
				else
					dfs(x, y, i, 0);
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章