| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
偶第一次遇到这样的事 TL 到死递归 非递归都写了 结果还是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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator