| ||||||||||
| 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 | |||||||||
史上最艰难的AC,好不容易终于过了!撒花贴代码留念!刚开始沿着墙走的意思没理解,后来模拟各种不顺利。
调这破程序跳的快不会爱了,终于AC了,好不容易啊!
#include<iostream>
#include<Cstdio>
using namespace std;
int movX[4] = {-1, 0, 1, 0};
int movY[4] = {0, 1, 0, -1};
int map[101][101], wide, height, endX, endY, startX, startY;
char input[100];
///////////////
struct node
{
int x, y, time;
};
int hash[101][101];
node q[2000];
/////////////////
bool check1(int x, int y, int dir)
{
bool flag1 = (x >= 0) && (x < height)
&& (y >= 0) && (y < wide) && (map[x][y] != -1);
int d1 = (dir + 1) % 4;
int x1 = x + movX[d1], y1 = y + movY[d1];
bool flag2 = (x1 >= 0) && (x1 < height)
&& (y1 >= 0) && (y1 < wide) && (map[x1][y1] == -1 || map[x1][y1] == 1);
// cout << x << " " << y <<endl;
// cout << x1 << " " << y1 <<endl;
// cout << flag1 << " "
// cout << endl;
return (flag1 && flag2);
}
int dfs1(int tempX, int tempY, int direction)
{
//cout << tempX << " " << tempY <<endl;
if(tempX == endX && tempY == endY)
{
return 1;
}
int d[4] = {(direction + 1)%4, direction, (direction + 7) %4
, (direction + 2)%4};
int posX[4], posY[4];
posX[0] = tempX + movX[d[0]]; posY[0] = tempY + movY[d[0]];
posX[1] = tempX + movX[d[1]]; posY[1] = tempY + movY[d[1]];
posX[2] = tempX + movX[d[2]]; posY[2] = tempY + movY[d[2]];
posX[3] = tempX + movX[d[3]]; posY[3] = tempY + movY[d[3]];
if(check1(posX[0], posY[0], d[0]))
return dfs1(posX[0], posY[0], d[0]) + 1;
if(check1(tempX, tempY, direction) && (map[posX[1]][posY[1]] != -1))
return dfs1(posX[1], posY[1], d[1]) + 1;
if(check1(posX[2], posY[2], d[2]))
return dfs1(posX[2], posY[2], d[2]) + 1;
return dfs1(posX[3], posY[3], d[3]) + 1;
}
bool check2(int x, int y, int dir)
{
bool flag1 = (x >= 0) && (x < height)
&& (y >= 0) && (y < wide) && (map[x][y] != -1);
int d1 = (dir + 3) % 4;
int x1 = x + movX[d1], y1 = y + movY[d1];
bool flag2 = (x1 >= 0) && (x1 < height)
&& (y1 >= 0) && (y1 < wide) && (map[x1][y1] == -1 || map[x1][y1] == 1);
// cout << x << " " << y <<endl;
// cout << x1 << " " << y1 <<endl;
// cout << flag1 << " "
// cout << endl;
return (flag1 && flag2);
}
int dfs2(int tempX, int tempY, int direction)
{
//cout << tempX << " " << tempY <<endl;
if(tempX == endX && tempY == endY)
{
return 1;
}
int d[4] = {(direction + 3)%4, direction, (direction + 1) %4
, (direction + 2)%4};
int posX[4], posY[4];
posX[0] = tempX + movX[d[0]]; posY[0] = tempY + movY[d[0]];
posX[1] = tempX + movX[d[1]]; posY[1] = tempY + movY[d[1]];
posX[2] = tempX + movX[d[2]]; posY[2] = tempY + movY[d[2]];
posX[3] = tempX + movX[d[3]]; posY[3] = tempY + movY[d[3]];
if(check2(posX[0], posY[0], d[0]))
return dfs2(posX[0], posY[0], d[0]) + 1;
// cout << (map[posX[1]][posY[1]]!= -1)<< endl;
// cout << check2(tempX, tempY, direction) << endl;
if(check2(tempX, tempY, direction) && (map[posX[1]][posY[1]] != -1))
return dfs2(posX[1], posY[1], d[1]) + 1;
if(check2(posX[2], posY[2], d[2]))
return dfs2(posX[2], posY[2], d[2]) + 1;
return dfs2(posX[3], posY[3], d[3]) + 1;
}
int bfs()
{
int front = 0, end = 1, x, y, time;
q[0].x = startX; q[0].y = startY; q[0].time = 0;
while (end > front)
{
x = q[front].x; y = q[front].y; time = q[front].time;
//cout << x << " " << y << endl;
front++;
if(x + 1 < height && map[x+1][y] != -1&& hash[x+1][y] == 0)
{
if(x + 1 == endX && y == endY)
return time + 2;
q[end].x = x + 1; q[end].y = y; q[end].time = time + 1;
hash[x+1][y] = 1;
end ++;
}
if(x - 1 >= 0 && map[x-1][y] != -1 && hash[x-1][y] == 0)
{
if(x - 1 == endX && y == endY)
return time + 2;
q[end].x = x - 1; q[end].y = y; q[end].time = time + 1;
hash[x-1][y] = 1;
end ++;
}
if(y + 1 < wide && map[x][y + 1] != -1 && hash[x][y+1] == 0)
{
if(x == endX && y + 1 == endY)
return time + 2;
q[end].x = x; q[end].y = y + 1; q[end].time = time + 1;
hash[x][y+1] = 1;
end ++;
}
if(y - 1 >= 0 && map[x][y - 1] != -1 &&hash[x][y-1] == 0)
{
if(x == endX && y - 1 == endY)
return time + 2;
q[end].x = x; q[end].y = y - 1; q[end].time = time + 1;
hash[x][y-1] = 1;
end ++;
}
}
return -1;
}
int main()
{
int size, i, j, dir;
char temp;
cin >> size;
while(size--)
{
scanf("%d%d", &wide, &height);
for(i = 0; i < 41; i++)
{
for(j = 0; j < 41; j++)
{
hash[i][j] = 0;
}
}
for(i = 0; i < height; i ++)
{
scanf("%s", input);
for(j = 0; j < wide; j++)
{
temp = input[j];
if(temp == '.')
map[i][j] = 0;
else if(temp == '#')
map[i][j] = -1;
else if(temp == 'S')
{
startX = i; startY = j;
map[i][j] = 1;
}
else if(temp == 'E')
{
endX = i; endY = j;
map[i][j] = 2;
}
}
}
if(startY == 0)
dir = 1;
if(startY == wide - 1)
dir = 3;
if(startX == 0)
dir = 2;
if(startX == height - 1)
dir = 0;
cout << dfs2(startX, startY, dir) << " ";
cout << dfs1(startX, startY, dir) << " ";
cout << bfs() << endl;
// cout << bfs() << endl;
// for(i = 0; i < height; i ++)
// {
// for(j = 0; j < wide; j++)
// {
// printf("%d ", map[i][j]);
//
// }
// cout << endl;
// }
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator