HDU 5094 Maze
自己是菜鸟,错了n多次
<span style="background-color: rgb(255, 255, 255);">#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
int xx;
int yy;
int key;
int step;
friend bool operator < (node n1, node n2){
return n1.step > n2.step;
}
};
int n, m, p, s, g, x1, y1, x2, y2, k, q;
int door[55][55][55][55];
int Time[55][55][1<<10];
int key[55][55];
int b[] = {1,2,4,8,16,32,64,128,256,512,1024,2048};
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
int judge(int ex, int ey)
{
if(ex >= 0&&ex < n&&ey >= 0&&ey < m) return 1;
return 0;
}
int bfs(int x, int y)
{
int i, j, l, flag;
priority_queue<node>q;
node now, next;
now.xx = x;
now.yy = y;
now.key = key[x][y];
now.step = 0;
q.push(now);
for(i = 0;i < 55;i++)
for(j = 0;j < 55;j++)
for(l = 0;l < (1<<10);l++)
Time[i][j][l] = 1000000;
Time[x][y][0] = 0;
while(!q.empty())
{
now = q.top();
q.pop();
if(now.xx == n - 1&&now.yy == m - 1){
return now.step;
}
for(i = 0;i < 4;i++)
{
next.xx = dx[i] + now.xx;
next.yy = dy[i] + now.yy;
x = next.xx;
y = next.yy;
if(judge(x, y)&&door[now.xx][now.yy][x][y] != 0)//遇到墙
{
flag = 0;
if(door[now.xx][now.yy][x][y] > 0)//遇到门
{
if((now.key & door[now.xx][now.yy][x][y]) == door[now.xx][now.yy][x][y])
{
flag = 1;
next.key = now.key;
next.step = now.step + 1;
}
else continue;
}
if(door[now.xx][now.yy][x][y] == -1)//没门没墙
{
flag = 1;
next.key = now.key;
next.step = now.step + 1;
}
if(key[x][y] != 0)//遇到钥匙
{
next.key = now.key | key[x][y];
if(!flag) next.step = now.step + 1;
}
if(Time[next.xx][next.yy][next.key] > next.step)
{
q.push(next);
Time[next.xx][next.yy][next.key] = next.step;
}
}
}
}
return -1;
}
int main()
{
int i, ans, ys;
while(scanf("%d %d %d", &n, &m, &p) != EOF)
{
scanf("%d", &k);
memset(door, -1, sizeof(door));
memset(key, 0, sizeof(key));
for(i = 0;i < k;i++)
{
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &g);
if(door[x1 - 1][y1 - 1][x2 - 1][y2 - 1] == -1)
{
door[x1 - 1][y1 - 1][x2 - 1][y2 - 1] = b[g];
door[x2 - 1][y2 - 1][x1 - 1][y1 - 1] = b[g];
}
else if(door[x1 - 1][y1 - 1][x2 - 1][y2 - 1] != 0)
{
door[x1 - 1][y1 - 1][x2 - 1][y2 - 1] = door[x1 - 1][y1 - 1][x2 - 1][y2 - 1] | b[g];
door[x2 - 1][y2 - 1][x1 - 1][y1 - 1] = door[x2 - 1][y2 - 1][x1 - 1][y1 - 1] | b[g];
}
}
scanf("%d", &s);
for(i = 0;i < s;i++)
{
scanf("%d %d %d", &x1, &y1, &q);
key[x1 - 1][y1 - 1] = key[x1 - 1][y1 - 1] | b[q];
}
ans = bfs(0, 0);
printf("%d\n", ans);
}
return 0;
}
</span>