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