hdu 3955 March

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

 

 

你可能感兴趣的:(HDU)