| ||||||||||
| 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 | |||||||||
我的coding超时,我用的STL的queue,哪位能帮我看看哪里可以提高, 感激不尽#include<iostream>
#include<queue>
#define MAX 550
using namespace std;
struct node
{
int r, c, method, d, step;//method 0表示站着,1表示躺着
};
struct Node
{
int method, d;
bool vis;
}vis[MAX][MAX];
char map[MAX][MAX];
int R, C, sr, sc, tr, tc, minStep;
int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1};//上下右左
queue<node> qq;
bool inmap(int r, int c)
{
return (r >= 0 && r < R && c >= 0 && c < C && map[r][c] != '#');
}
int bfs()
{
int i, j, k, newMethod, newd;
node now, tmp;
while(!qq.empty())
{
now = qq.front();
qq.pop();
for(k = 0; k < 4; k++)
{
//判断状态
if(now.method == 0)
{
newMethod = 1;
newd = k;
i = now.r + dir[k][0];
j = now.c + dir[k][1];
}
else
{
if(now.d == k)
{
newMethod = 0;
newd = -1;
i = now.r + 2 * dir[k][0];
j = now.c + 2 * dir[k][1];
}
else if( (now.d == 1 && k == 0) || (now.d == 0 && k == 1) || (now.d == 2 && k == 3) || (now.d == 3 && k == 2) )
{
newMethod = 0;
newd = -1;
i = now.r + dir[k][0];
j = now.c + dir[k][1];
}
else
{
newMethod = now.method;
newd = now.d;
i = now.r + dir[k][0];
j = now.c + dir[k][1];
}
}
if(!inmap(i, j) || (vis[i][j].vis && vis[i][j].method == newMethod && vis[i][j].d == newd) || (newMethod == 0 && map[i][j] == 'E') || (newMethod == 1 && map[i + dir[newd][0]][j + dir[newd][1]] == '#'))
continue;
tmp.r = i;
tmp.c = j;
tmp.method = newMethod;
tmp.d = newd;
tmp.step = now.step + 1;
vis[i][j].vis = true; vis[i][j].method = newMethod; vis[i][j].d = newd;
if(tmp.r == tr && tmp.c == tc && tmp.method == 0)
{
if(minStep > tmp.step)
minStep = tmp.step;
return minStep;
}
qq.push(tmp);
}
}
return -1;
}
int main()
{
int i, j, flag, firstMethod, firstd, firstdr, firstdc;
bool first;
while(scanf("%d %d", &R, &C) == 2)
{
if(R == 0 && C == 0)
break;
first = true;
minStep = 999999;
firstMethod = 0;
firstd = -1;
memset(vis, NULL, sizeof(vis));
for(i = 0; i < R; i++)
{
scanf("%s", &map[i]);
for(j = 0; j < C; j++)
{
if(map[i][j] == 'X')
{
if(first)
{
sr = i;
sc = j;
first = false;
}
else
{
firstMethod = 1;
firstdr = i - sr;
firstdc = j - sc;
if(firstdr == -1 && firstdc == 0)
firstd = 0;
else if(firstdr == 1 && firstdc == 0)
firstd = 1;
else if(firstdr = 0 && firstdc == 1)
firstd = 2;
else
firstd = 3;
}
}
else if(map[i][j] == 'O')
{
tr = i;
tc = j;
}
}
}
while(!qq.empty())
qq.pop();
node first;
first.r = sr;
first.c = sc;
first.method = firstMethod;
first.step = 0;
first.d = firstd;//-1表示站着
vis[sr][sc].vis = true; vis[sr][sc].method = firstMethod; vis[sr][sc].d = firstd;
qq.push(first);
flag = bfs();
if(flag == -1)
printf("Impossible\n");
else
printf("%d\n", flag);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator