题目是模拟一个游戏的,不太好读,它有一些乱七八糟的条件,很容易搞错
http://www.cppblog.com/aswmtjdsj/archive/2011/08/18/153800.html
这位大神的博客里讲得非常清楚
各种绕,各种折腾,哎...还是代码能力不行啊
继续苦练吧。。
#include <stdio.h>
#include <string.h>
#define maxn 105
#define inf 0xffffff
typedef struct
{
int x;
int y;
} point;
typedef struct node
{
int x;
int y;
int turn;
double mp;
} node;
typedef struct
{
int turn;
double mp;
}p;
p vis[maxn][maxn];
bool state[maxn][maxn][12];
bool zoc[maxn][maxn];
int mat[maxn][maxn];
node q[1000005];
int n,m;
double MP;
point st,ed;
int dx1[6]= {-1,0,1,1,0,-1};
int dy1[6]= {0,1,0,-1,-1,-1};
int dx2[6]= {-1,0,1,1,0,-1};
int dy2[6]= {1,1,1,0,-1,0};
void pre(int x,int y)
{
int k=mat[x][y];
for(int i=9; i>=0; i--)
{
if(k>=(1<<i))
{
state[x][y][i]=1;
k-=(1<<i);
}
}
}
int bfs()
{
int front=0,rear=0;
q[rear].x=st.x;
q[rear].y=st.y;
q[rear].mp=MP;
q[rear].turn=1;
vis[st.x][st.y].turn=1;
vis[st.x][st.y].mp=MP;
rear++;
while(front<rear)
{
node u=q[front];
// if(u.x==ed.x&&u.y==ed.y)
// {
// return 0;
// }
if(u.mp<=0)
{
u.mp=MP;
u.turn++;
}
int xx,yy;
for(int i=0; i<6; i++)
{
if(u.x%2==0)
{
xx=u.x+dx1[i];
yy=u.y+dy1[i];
}
else
{
xx=u.x+dx2[i];
yy=u.y+dy2[i];
}
if(xx<0||xx>=n||yy<0||yy>=m)
{
continue;
}
if(state[xx][yy][3]==1)
{
continue;
}
if(zoc[u.x][u.y]==1&&zoc[xx][yy]==1)
{
if((u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&vis[xx][yy].mp<0)))
{
q[rear].x=xx;
q[rear].y=yy;
q[rear].turn=u.turn;
q[rear].mp=0;
vis[xx][yy].turn=u.turn;
vis[xx][yy].mp=0;
rear++;
}
}
else if(state[u.x][u.y][2]==1&&state[xx][yy][2]==1)
{
if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-0.25>vis[xx][yy].mp))
{
q[rear].x=xx;
q[rear].y=yy;
q[rear].turn=u.turn;
q[rear].mp=u.mp-0.25;
vis[xx][yy].turn=u.turn;
vis[xx][yy].mp=u.mp-0.25;
rear++;
}
}
else if(state[u.x][u.y][i+4]==1)
{
if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&vis[xx][yy].mp<0))
{
q[rear].x=xx;
q[rear].y=yy;
q[rear].turn=u.turn;
q[rear].mp=0;
vis[xx][yy].turn=u.turn;
vis[xx][yy].mp=0;
rear++;
}
}
else if(state[xx][yy][1]==1)
{
if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-2>vis[xx][yy].mp))
{
q[rear].x=xx;
q[rear].y=yy;
q[rear].turn=u.turn;
q[rear].mp=u.mp-2;
vis[xx][yy].turn=u.turn;
vis[xx][yy].mp=u.mp-2;
rear++;
}
}
else if(state[xx][yy][0]==1)
{
if(u.turn<vis[xx][yy].turn||(u.turn==vis[xx][yy].turn&&u.mp-1>vis[xx][yy].mp))
{
q[rear].x=xx;
q[rear].y=yy;
q[rear].turn=u.turn;
q[rear].mp=u.mp-1;
vis[xx][yy].turn=u.turn;
vis[xx][yy].mp=u.mp-1;
rear++;
}
}
}
front++;
}
}
int main()
{
int T,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%lf",&n,&m,&MP);
memset(state,0,sizeof(state));
memset(zoc,0,sizeof(zoc));
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
vis[i][j].turn=inf;
vis[i][j].mp=0;
scanf("%d",&mat[i][j]);
pre(i,j);
if(state[i][j][3]==1)
{
int xx,yy;
if(i%2==0)
{
for(int k=0; k<6; k++)
{
xx=i+dx1[k];
yy=j+dy1[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m)
zoc[xx][yy]=1;
}
}
else
{
for(int k=0; k<6; k++)
{
xx=i+dx2[k];
yy=j+dy2[k];
if(xx>=0&&xx<n&&yy>=0&&yy<m)
zoc[xx][yy]=1;
}
}
}
}
}
scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);
//ans=inf;
bfs();
if(vis[ed.x][ed.y].turn==inf)
printf("Case %d: -1\n",++cas);
else
printf("Case %d: %d\n",++cas,vis[ed.x][ed.y].turn);
}
return 0;
}