Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

偶第一次遇到这样的事 TL 到死

Posted by ohsohot at 2010-04-04 13:28:46 on Problem 3083
递归 非递归都写了 结果还是TL  搞了一上午 万念俱灰 准备吃饭 突然发现 偶没读前面的N  我X!!

#include <iostream>
#define MAXWH 45
using namespace std;
 
char maze[MAXWH][MAXWH];
int W, H;
int Si, Sj;
int Ei, Ej;
int position;
struct STEP 
{
	int AddI;
	int AddJ;
};
STEP Setps[4];
int LTotal;
int RTotal;
int Total;
int visit[MAXWH][MAXWH];
struct
{
	int i;
	int j;
	int height;
}Queue[MAXWH*MAXWH];

void InitSteps()
{
	memset(Setps, 0, sizeof(Setps));
	Setps[0].AddI = -1;
	Setps[1].AddJ = 1;
	Setps[2].AddI = 1;
	Setps[3].AddJ = -1;
}

void LSPath()
{
	int NextI, NextJ, PosI, PosJ;
	PosI = Si;
	PosJ = Sj;
	LTotal++;
	while(true)
	{
		for (int i = 0; i < 4; i++)
		{
			NextI = PosI + Setps[(position-1+4+i)%4].AddI;
			NextJ = PosJ + Setps[(position-1+4+i)%4].AddJ;
			if (NextJ >= W || NextJ < 0 || NextI >= H || NextI < 0)
			{
				continue;
			}
			if (maze[NextI][NextJ] == '.' )
			{
				LTotal++;
				PosI = NextI;
				PosJ = NextJ;
				position = (position-1+4+i)%4;
				break;
			}
			if(maze[NextI][NextJ] == 'E')
			{
				LTotal++;
				return;
			}
		}
	}
}

void LDFS(int PosI, int PosJ)
{
	LTotal++;
	if (maze[PosI][PosJ] == 'E')
	{
		return;
	}
	int NextI, NextJ;

	for (int i = 0; i < 4; i++)
	{
		NextI = PosI + Setps[(position-1+4+i)%4].AddI;
		NextJ = PosJ + Setps[(position-1+4+i)%4].AddJ;
		if (NextJ >= W || NextJ < 0 || NextI >= H || NextI < 0)
		{
			continue;
		}
		if (maze[NextI][NextJ] == '.' || maze[NextI][NextJ] =='E')
		{
			position = (position-1+4+i)%4;
			LDFS(NextI, NextJ);
			return;
		}
	}
}

void RSPath()
{
	int NextI, NextJ, PosI, PosJ;
	PosI = Si;
	PosJ = Sj;
	RTotal++;
	while(true)
	{
		for (int i = 0; i < 4; i++)
		{
			NextI = PosI + Setps[(position+1-i+4)%4].AddI;
			NextJ = PosJ + Setps[(position+1-i+4)%4].AddJ;
			if (NextJ >= W || NextJ < 0 || NextI >= H || NextI < 0)
			{
				continue;
			}
			if (maze[NextI][NextJ] == '.' )
			{
				RTotal++;
				PosI = NextI;
				PosJ = NextJ;
				position = (position+1+4-i)%4;
				break;
			}
			if(maze[NextI][NextJ] == 'E')
			{
				RTotal++;
				return;
			}
		}
	}
}

void RDFS(int PosI, int PosJ)
{
	RTotal++;
	if (maze[PosI][PosJ] == 'E')
	{
		return;
	}
	int NextI, NextJ;

	for (int i = 0; i < 4; i++)
	{
		NextI = PosI + Setps[(position+1-i+4)%4].AddI;
		NextJ = PosJ + Setps[(position+1-i+4)%4].AddJ;
		if (NextJ >= W || NextJ < 0 || NextI >= H || NextI < 0)
		{
			continue;
		}
		if (maze[NextI][NextJ] == '.' || maze[NextI][NextJ] =='E')
		{
			position = (position+1-i+4)%4;
			RDFS(NextI, NextJ);
			return;
		}
	}
}

void BFS()
{
	int NextI, NextJ, PosI, PosJ, height;
	Total = 0;
	visit[Si][Sj] = 1;
	int head, tail;
	head = tail = 0;
	Queue[tail].i = Si;
	Queue[tail].j = Sj;
	Queue[tail++].height = 1;

	while (head < tail)
	{
		PosI = Queue[head].i;
		PosJ = Queue[head].j;
		height = Queue[head++].height;
		if (maze[PosI][PosJ] == 'E')
		{
			Total = height;
			return;
		}

		for (int i = 0; i < 4; i++)
		{
			NextI = PosI + Setps[i].AddI;
			NextJ = PosJ + Setps[i].AddJ;

			if (NextJ >= W || NextJ < 0 || NextI >= H || NextI < 0)
			{
				continue;
			}
			if (visit[NextI][NextJ] == 0)
			{
				visit[NextI][NextJ] = 1;
				if (maze[NextI][NextJ] == '.' || maze[NextI][NextJ] == 'E')
				{		
					Queue[tail].i = NextI;
					Queue[tail].j = NextJ;
					Queue[tail++].height = height+1;
				}
			}	
		}
	}
}

int main()
{
	//freopen("test.txt", "r", stdin);
	InitSteps();
	int n;
	scanf("%d", &n);
	while (scanf("%d %d", &W, &H) != EOF)
	{
		LTotal = RTotal = 0;
		Total = 0;
		memset(visit, 0, sizeof(visit));
		memset(maze, 0, sizeof(maze));

		//scanf("%c", &c);
		for (int i = 0; i < H; i++)
		{
			//gets(maze[i]);
			scanf("%s", maze[i]);
		}
		for (int i = 0; i < H; i++)
		{
			for (int j = 0; j < W; j++)
			{
				if (maze[i][j] == 'S')
				{
					Si = i;
					Sj = j;
				}
				else if (maze[i][j] == 'E')
				{
					Ei = i;
					Ej = j;
				}
			}
		}

		if (Si == 0)
		{
			position = 2;
		}
		else if (Si == H-1)
		{
			position = 0;
		}
		else if (Sj == 0)
		{
			position = 1;
		}
		else
			position = 3;

		int bak = position;
		LDFS(Si, Sj);
		//LSPath();
		position = bak;
		RDFS(Si, Sj);
		//RSPath();
		BFS();
		printf("%d %d %d\n", LTotal, RTotal,Total);
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator