题目链接: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 } 

 

 

posted on 2012-07-06 20:46  奋斗青春  阅读(244)  评论(0编辑  收藏  举报