http://poj.org/problem?id=2049
与一般的BFS不大一样 是把网格转换成我们常用的点
以左下角的点表示整个方格 用优先队列来保证每次搜的都是最小的 注意Nemo的位置有可能不在墙内
之前把sx看成tx一直调试不出来 ,,纠结了一天 第二天一眼看出它俩不一样。。改完之后 找了找结构体的优先队列怎么用 按知道上回答写的 一直WA 后来看人家的解题报告 发现不是那么用的,改过来交上AC。。
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 typedef struct node 7 { 8 int num,x,y; 9 friend bool operator<( struct node a, struct node b ) 10 { 11 return a.num>b.num; 12 } 13 }st; 14 int p[2][301][301],pt[2][300][300],pf[300][300]; 15 st ne,na; 16 int main() 17 { 18 int n,m,i,j,x,y,t,d,g; 19 float x1,y1; 20 while(cin>>n>>m) 21 { 22 if(n==-1&&m==-1) 23 break; 24 memset(p,0,sizeof(p)); 25 memset(pf,0,sizeof(pf)); 26 memset(pt,0,sizeof(pt)); 27 int f = 1; 28 int minx=300,miny = 300,maxx = -1,maxy = -1; 29 for(i = 1; i <= n ; i++) 30 { 31 cin>>x>>y>>t>>d; 32 if(x<minx) 33 minx = x; 34 if(y<miny) 35 miny = y; 36 if(t==0) 37 { 38 if(maxx<x+d) 39 maxx = x+d; 40 if(maxy<y) 41 maxy = y; 42 for(g = x ; g < x+d ; g++) 43 p[0][g][y] = 1; 44 } 45 else 46 { 47 if(maxy<y+d) 48 maxy = y+d; 49 if(maxx<x) 50 maxx = x; 51 for(g = y ;g < y+d ; g++) 52 p[1][x][g] = 1; 53 } 54 } 55 for(i = 1; i <= m ; i++) 56 { 57 cin>>x>>y>>t; 58 if(maxx<x) 59 maxx = x; 60 if(maxy<y) 61 maxy = y; 62 if(minx>x) 63 minx = x; 64 if(miny>y) 65 miny = y; 66 pt[t][x][y] = 1; 67 } 68 scanf("%f%f", &x1,&y1); 69 int sx = (int)x1; 70 int sy = (int)y1; 71 int flag = 0; 72 if(sx>maxx||sx<minx||sy>maxy||sy<miny) 73 f = 0; 74 else 75 { 76 priority_queue <st> q; 77 ne.num = 0; 78 ne.x = sx; 79 ne.y = sy; 80 q.push(ne); 81 pf[sx][sy]=1; 82 while(!q.empty()) 83 { 84 na = q.top(); 85 int tx = na.x; 86 int ty = na.y; 87 q.pop(); 88 if(tx>=maxx||tx<minx||ty>=maxy||ty<miny) 89 { 90 flag = 1; 91 break; 92 } 93 if((pt[1][tx][ty]||!p[1][tx][ty])&&tx-1>=0&&!pf[tx-1][ty]) 94 { 95 pf[tx-1][ty] = 1; 96 if(pt[1][tx][ty]) 97 ne.num = na.num+1; 98 else 99 ne.num = na.num; 100 ne.x = tx-1; 101 ne.y = ty; 102 q.push(ne); 103 } 104 if((pt[1][tx+1][ty]||!p[1][tx+1][ty])&&!pf[tx+1][ty]) 105 { 106 pf[tx+1][ty] = 1; 107 if(pt[1][tx+1][ty]) 108 ne.num = na.num+1; 109 else 110 ne.num = na.num ; 111 ne.x = tx+1; 112 ne.y = ty; 113 q.push(ne); 114 } 115 if((pt[0][tx][ty+1]||!p[0][tx][ty+1])&&!pf[tx][ty+1]) 116 { 117 pf[tx][ty+1] = 1; 118 if(pt[0][tx][ty+1]) 119 ne.num = na.num+1; 120 else 121 ne.num = na.num; 122 ne.x = tx; 123 ne.y = ty+1; 124 q.push(ne); 125 } 126 if((pt[0][tx][ty]||!p[0][tx][ty])&&ty-1>=0&&!pf[tx][ty-1]) 127 { 128 pf[tx][ty-1] = 1; 129 if(pt[0][tx][ty]) 130 ne.num = na.num+1; 131 else 132 ne.num = na.num ; 133 ne.x = tx; 134 ne.y = ty-1; 135 q.push(ne); 136 } 137 } 138 } 139 if(!f||!flag) 140 { 141 if(!f) 142 cout<<"0"<<endl; 143 else 144 cout<<"-1"<<endl; 145 } 146 else 147 cout<<na.num<<endl; 148 } 149 return 0; 150 }