| ||||||||||
| 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 | |||||||||
贴代码#include <stdio.h>
#include <string.h>
const int maxS = 46;
const int step[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
const int leftDs[4][4] = {{3, 0, 1, 2}, {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}};
const int rightDs[4][4] = {{1, 0, 3, 2}, {2, 1, 0, 3}, {3, 2, 1, 0}, {0, 3, 2, 1}};
int w, h;
char maze[maxS][maxS];
struct Pox
{
int x, y;
int d; // 0 north, 1 east, 2 south, 3 west
Pox() : x(-1), y(-1), d(0) {}
};
Pox src;
struct BfsPox
{
int x, y, l;
BfsPox() : x(-1), y(-1), l(0) {}
};
BfsPox bfsPoxs[maxS * maxS];
bool mark[maxS][maxS][4];
bool bfsMark[maxS][maxS];
int bfsRet;
int leftRet;
int rightRet;
void findSource(int index)
{
if (src.x != -1)
{
return;
}
if (index == 0 || index == h - 1)
{
for (int j = 0; j < w; ++ j)
{
if (maze[index][j] == 'S')
{
src.x = index;
src.y = j;
src.d = (index == 0) ? 2 : 0;
return;
}
}
}
if (maze[index][0] == 'S')
{
src.x = index;
src.y = 0;
src.d = 1;
return;
}
if (maze[index][w - 1] == 'S')
{
src.x = index;
src.y = w - 1;
src.d = 3;
return;
}
}
void inputData()
{
scanf("%d%d", &w, &h);
for (int i = 0; i < h; ++ i)
{
scanf("%s", &maze[i]);
findSource(i);
}
}
bool dfsLeft(int x, int y, int d)
{
++ leftRet;
if (maze[x][y] == 'E')
{
return true;
}
for (int i = 0; i < 4; ++ i)
{
int newD = leftDs[d][i];
int newX = x + step[newD][0];
int newY = y + step[newD][1];
if (newX < 0 || newX >= h || newY < 0 || newY >= w || maze[newX][newY] == '#' || mark[x][y][newD])
{
continue;
}
mark[x][y][newD] = true;
if (dfsLeft(newX, newY, newD))
{
return true;
}
}
return false;
}
bool dfsRight(int x, int y, int d)
{
++ rightRet;
if (maze[x][y] == 'E')
{
return true;
}
for (int i = 0; i < 4; ++ i)
{
int newD = rightDs[d][i];
int newX = x + step[newD][0];
int newY = y + step[newD][1];
if (newX < 0 || newX >= h || newY < 0 || newY >= w || maze[newX][newY] == '#' || mark[x][y][newD])
{
continue;
}
mark[x][y][newD] = true;
if (dfsRight(newX, newY, newD))
{
return true;
}
}
return false;
}
void bfs()
{
int len = 1;
bfsPoxs[0].x = src.x;
bfsPoxs[0].y = src.y;
bfsPoxs[0].l = 1;
bfsMark[src.x][src.y] = true;
bfsRet = 1;
for (int i = 0; i < len; ++ i)
{
for (int j = 0; j < 4; ++ j)
{
int newX = bfsPoxs[i].x + step[j][0];
int newY = bfsPoxs[i].y + step[j][1];
if (newX < 0 || newX >= h || newY < 0 || newY >= w || maze[newX][newY] == '#' || bfsMark[newX][newY])
{
continue;
}
if (maze[newX][newY] == 'E')
{
bfsRet = bfsPoxs[i].l + 1;
return;
}
bfsMark[newX][newY] = true;
bfsPoxs[len].x = newX;
bfsPoxs[len].y = newY;
bfsPoxs[len].l = bfsPoxs[i].l + 1;
++ len;
}
}
}
void process()
{
leftRet = 0;
memset(mark, 0, sizeof(mark));
dfsLeft(src.x, src.y, src.d);
rightRet = 0;
memset(mark, 0, sizeof(mark));
dfsRight(src.x, src.y, src.d);
bfsRet = 0;
memset(bfsMark, 0, sizeof(bfsMark));
bfs();
printf("%d %d %d\n", leftRet, rightRet, bfsRet);
src.x = -1;
src.y = -1;
}
int main()
{
int cases;
scanf("%d", &cases);
for (int i = 0; i < cases; ++ i)
{
inputData();
process();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator