题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3955
题意很难懂,读懂的话就是一道比较容易的广搜题。
需要注意几个优先关系:
1.判断是否在敌人的控制区域间穿梭
2.判断是否有路
3.判断是否有河流
4.正常的行进
还需要注意一点 只要他现在有MPS哪怕很少 他都可以再走一步。
View Code
1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # include<queue> 5 # define N 105 6 using namespace std; 7 int n,m,MP; 8 bool map[N][N][10]; 9 bool visit[N][N]; 10 int x0,y0,endx,endy; 11 int dir1[6][2]={-1,1, 0,1, 1,1, 1,0, 0,-1, -1,0}; 12 int dir2[6][2]={-1,0, 0,1, 1,0, 1,-1, 0,-1, -1,-1}; 13 struct node{ 14 int x,y; 15 int sum; 16 bool operator<(const node &b) const 17 { 18 return b.sum < sum; 19 } 20 }; 21 int MIN(int a,int b) 22 { 23 return a<b?a:b; 24 } 25 bool is(int xx,int yy) 26 { 27 if(xx<0 || xx>=n || yy<0 || yy>=m) return 0; 28 return 1; 29 } 30 bool is1(int xx,int yy) 31 { 32 int i,x1,y1; 33 if(xx%2==1) 34 { 35 for(i=0;i<6;i++) 36 { 37 x1=xx+dir1[i][0]; 38 y1=yy+dir1[i][1]; 39 if(is(x1,y1) && map[x1][y1][3]) return 1; 40 } 41 return 0; 42 } 43 else 44 { 45 for(i=0;i<6;i++) 46 { 47 x1=xx+dir2[i][0]; 48 y1=yy+dir2[i][1]; 49 if(is(x1,y1) && map[x1][y1][3]) return 1; 50 } 51 return 0; 52 } 53 } 54 int bfs() 55 { 56 priority_queue<node>q; 57 node cur,next; 58 int i,cost,remain; 59 cur.x=x0; 60 cur.y=y0; 61 cur.sum=0; 62 while(!q.empty()) q.pop(); 63 q.push(cur); 64 while(!q.empty()) 65 { 66 cur=q.top(); 67 q.pop(); 68 remain=MP-cur.sum%MP; 69 if(cur.x==endx && cur.y==endy) 70 { 71 if(remain==MP) return cur.sum/MP; 72 else return cur.sum/MP+1; 73 } 74 if(visit[cur.x][cur.y]) continue; 75 visit[cur.x][cur.y]=1; 76 for(i=0;i<6;i++) 77 { 78 if(cur.x%2==1) 79 { 80 next.x=cur.x+dir1[i][0]; 81 next.y=cur.y+dir1[i][1]; 82 } 83 else 84 { 85 next.x=cur.x+dir2[i][0]; 86 next.y=cur.y+dir2[i][1]; 87 } 88 if(!(is(next.x,next.y)) || map[next.x][next.y][3]) continue; 89 if(is1(cur.x,cur.y) && is1(next.x,next.y)) 90 { 91 next.sum=cur.sum+remain; 92 q.push(next); 93 } 94 else if(map[cur.x][cur.y][2] && map[next.x][next.y][2]) 95 { 96 next.sum=cur.sum+1; 97 q.push(next); 98 } 99 else if(map[cur.x][cur.y][i+4]) 100 { 101 next.sum=cur.sum+remain; 102 q.push(next); 103 } 104 else 105 { 106 if(map[next.x][next.y][0]) cost=1; 107 else cost=2; 108 cost *=4; 109 next.sum=cur.sum+MIN(cost,remain); 110 q.push(next); 111 } 112 } 113 } 114 return -1; 115 } 116 int main() 117 { 118 int i,j,ncase,t,k; 119 int a[10],ans; 120 a[0]=1; 121 for(i=1;i<10;i++) 122 a[i]=a[i-1]*2; 123 scanf("%d",&ncase); 124 for(t=1;t<=ncase;t++) 125 { 126 scanf("%d%d%d",&n,&m,&MP); 127 MP*=4; 128 memset(map,0,sizeof(map)); 129 for(i=0;i<n;i++) 130 for(j=0;j<m;j++) 131 { 132 scanf("%d",&ans); 133 for(k=9;k>=0;k--) 134 if(ans>=a[k]) 135 { 136 map[i][j][k]=1; 137 ans-=a[k]; 138 } 139 } 140 scanf("%d%d%d%d",&x0,&y0,&endx,&endy); 141 memset(visit,0,sizeof(visit)); 142 printf("Case %d: %d\n",t,bfs()); 143 } 144 system("pause"); 145 return 0; 146 }