海底总动员。。。。
这个题开始不会建图,彻底颠覆以前我对广搜题的想法。想了好久, 忽然想到省赛时HYPO让我做三维BFS来着,一直没做,看到POJ计划这个题,就是三维BFS解题,就做了一下, 对于这个题。。。。实在不知道说什么好,又坑、又SB,POJ的后台数据和题目描述的完全不一样,看了DIscuss之后开始 改动代码,最后改的又臭又长,搜了无数题解找数据,卡了整整两天。
挥挥洒洒 160行。。。。同时也是我第一次使用 三维建图+BFS,纪念一下!
2049 算是我攻克POJ计划的第一个卡两天的难关,POJ完成进度 10/200,为了庆贺一下,我决定回去睡个觉;
input
0 0
-100.0 -100.0
-1 -1
打印
0
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 7410 | Accepted: 1725 |
Description
Input
Output
Sample Input
8 9 1 1 1 3 2 1 1 3 3 1 1 3 4 1 1 3 1 1 0 3 1 2 0 3 1 3 0 3 1 4 0 3 2 1 1 2 2 1 2 3 1 3 1 1 3 2 1 3 3 1 1 2 0 3 3 0 4 3 1 1.5 1.5 4 0 1 1 0 1 1 1 1 1 2 1 1 1 1 2 0 1 1.5 1.7 -1 -1
Sample Output
5 -1
Source
ME time WA RE AC
1536KB 32ms 15 + 9 = 1
我的第三维只是储存 墙和门
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #define right 0 #define up 1 #define wall 3 #define door 4 #define null 0 const int N = 210; const int Size = 999999; const int INF = 1<<20; using namespace std; struct node{ int x,y,ans; }q[Size]; int mapp[N][N][2]; int vis[N][N]; int n,m,result; int mv[4][2] = {{1,0},{0,-1},{0,1},{-1,0}}; void init() { result = 0; memset(mapp,0,sizeof(mapp));//初始化空地 memset(vis,0,sizeof(vis)); } void BFS(int x,int y) { node f,t; int s = 0,e = 0; f.x = x; f.y = y; f.ans = 0; q[e++] = f; vis[x][y] = 1; result = INF; while(s < e) { t = q[s++]; if(t.x ==0 || t.y ==0 || t.x > 198 || t.y > 198 ) //边界处理,但是不能跳出,只能跳过,因为存在多个门的情况 { if(result > t.ans) //走出去之后,保存最小通过门数 result = t.ans; continue; //注意,不要break, } for(int i = 0;i<4;i++) { f.x = t.x + mv[i][0]; f.y = t.y + mv[i][1]; // printf("asd\n"); if(i==0) { if(!vis[f.x][f.y] && mapp[t.x][t.y][up]!=wall)//右 { if(mapp[t.x][t.y][up]==door) f.ans = t.ans +1; else f.ans = t.ans; vis[f.x][f.y] = 1; q[e++] = f; } } else if(i==1) { if(!vis[f.x][f.y] && mapp[f.x][f.y][right]!=wall) //下 { if(mapp[f.x][f.y][right]==door) f.ans = t.ans +1; else f.ans = t.ans; vis[f.x][f.y] = 1; q[e++] = f; } } else if(i==2) { if(!vis[f.x][f.y] && mapp[t.x][t.y][right]!=wall)//上 { if(mapp[t.x][t.y][right]==door) f.ans = t.ans +1; else f.ans = t.ans; vis[f.x][f.y] = 1; q[e++] = f; } } else if(i==3) { if(!vis[f.x][f.y] && mapp[f.x][f.y][up]!=wall)//左 { if(mapp[f.x][f.y][up]==door) f.ans = t.ans +1; else f.ans = t.ans; vis[f.x][f.y] = 1; q[e++] = f; } } } } } int main() { int x,y,d,t; double Nemo_x,Nemo_y; while(~scanf("%d%d",&m,&n)) { if(n==-1 && m==-1) break; init(); for(int num_wall = 0;num_wall < m;num_wall++) { scanf("%d%d%d%d",&x,&y,&d,&t); if(d) { for(int num = 0;num < t;num++) mapp[x-1][y+num][up] = wall; } else { for(int num = 0;num < t;num++) mapp[x+num][y-1][right] = wall; } } for(int num_door = 0;num_door < n;num_door++) { scanf("%d%d%d",&x,&y,&d); if(d) mapp[x-1][y][up] = door; else mapp[x][y-1][right] = door; } int xx,yy; cin>>Nemo_x>>Nemo_y; xx = (int)(Nemo_x + 0.0001);//这里要注意 double 取整时 会有损失0.99999 会变成0 yy = (int)(Nemo_y + 0.0001); if(n==0 && m==0) { printf("0\n"); continue; } if(xx <=0 || yy <= 0 || xx >= 199 || yy >= 199) //后台可能出现 0,0 200+,200+,虽然不符合题目描述 { printf("0\n"); } else { BFS(xx,yy); (result==INF)?printf("-1\n"):printf("%d\n",result); } } return 0; }
POJ 2049— Finding Nemo(三维BFS)10/200,布布扣,bubuko.com
POJ 2049— Finding Nemo(三维BFS)10/200
原文:http://blog.csdn.net/wjw0130/article/details/29562915