标签:
4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4 3 0 4 3 4 4 0 2 2 1 2 4 2 1
把 map 数组初始化为 -1 了 ,测试样例都过不了,调试了2个多小时才发现 ,真是越来越都比了。
还要注意:一个地方可能多多个不同类型的钥匙,坑啊
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define maxn 55 using namespace std; int vis[maxn][maxn][1 << 11]; int map[maxn][maxn][maxn][maxn]; int keynum[maxn][maxn][11];//记录这个地点有哪几种钥匙 int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0}; int n, m, p, s, k;//p代表有几种钥匙。 struct node{ int x, y ,step, key; friend bool operator < (node a , node b) { return a.step > b.step; } }; int check(node a, node b) { if(b.x <= 0 || b.x > n || b.y <= 0 || b.y > m) return 0; if(map[a.x][a.y][b.x][b.y] == 0) return 0; return 1; } int BFS(){ priority_queue<node>q; node now, next; now.x = 1; now.y = 1; now.step = 0; now.key = 0; for(int j = 1; j <= 10; ++j){// 起点有钥匙 if(keynum[now.x][now.y][j]) now.key = now.key | (1 << j); } q.push(now); vis[now.x][now.y][now.key] = 1; while(!q.empty()){ now = q.top(); q.pop(); if(now.x == n && now.y == m){ return now.step; } for(int i = 0; i < 4; ++i){ next.x = now.x + dir[i][0]; next.y = now.y + dir[i][1]; next.step = now.step + 1; //printf("--%d\n", next.step); next.key = now.key; if(check(now, next)){//now 和 next 之间没有墙 if(map[now.x][now.y][next.x][next.y] > 0){ //now 和 next 中间有门 if(next.key & (1 << map[now.x][now.y][next.x][next.y])){//有这个门的钥匙,能通过这个门到达next for(int j = 1; j <= 10; ++j){ //判断点next是不是有钥匙 if(keynum[next.x][next.y][j]) next.key = next.key | (1 << j); } if(!vis[next.x][next.y][next.key]){ vis[next.x][next.y][next.key] = 1; q.push(next); } } } else { for(int j = 1; j <= 10; ++j){//判断点next是不是有钥匙 if(keynum[next.x][next.y][j]){ next.key = next.key | (1 << j); } } if(!vis[next.x][next.y][next.key]){ vis[next.x][next.y][next.key] = 1; q.push(next); } } } } } return -1; } int main (){ while(scanf("%d%d%d", &n, &m, &p) != EOF){ scanf("%d", &k); memset(map, -1, sizeof(map)); memset(vis, 0, sizeof(vis)); memset(keynum, 0, sizeof(keynum)); while(k--){ int x1, y1, x2, y2, t; scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &t); map[x1][y1][x2][y2] = t; map[x2][y2][x1][y1] = t; } scanf("%d", &s); while(s--){ int x, y, t; scanf("%d%d%d", &x, &y, &t); keynum[x][y][t] = 1; } printf("%d\n", BFS()); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47627535