hdu1728: http://acm.hdu.edu.cn/showproblem.php?pid=1728
题意:求最少转弯数,开始时方向不定,所以第一次算不成转弯
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int q[150*600][2],d[150][150][4];
char v[150][150];
const int inf=1<<29;
int main()
{
int i,j,m,n,x,y,u,w,nx,ny,x1,y1,x2,y2,k,t,front,rear,dir;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
getchar();
for(i=0;i<m;i++)
gets(v[i]);
scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);
if(v[y2-1][x2-1]=='*')
{
printf("no\n");
continue;
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(int z=0;z<4;z++)
d[i][j][z]=inf;
for(i=0;i<4;i++)
d[y1-1][x1-1][i]=0;
front=0;rear=0;
u=(y1-1)*n+x1-1;
q[rear++][0]=u;q[rear-1][1]=0;
while(rear>front)
{
u=q[front++][0];dir=q[front-1][1]; //加一维存方向
x=u/n;y=u%n;
for(i=0;i<4;i++) //枚举4个方向
{
nx=x+dx[i];ny=y+dy[i];
if(nx>=0&&nx<m&&ny>=0&&ny<n&&v[nx][ny]!='*')
{
if(i==dir||front==1)
{
if(d[nx][ny][i]>d[x][y][dir])
{
d[nx][ny][i]=d[x][y][dir];
w=nx*n+ny;
q[rear++][0]=w;
q[rear-1][1]=i;
}
}
else
{
if(d[nx][ny][i]>d[x][y][dir]+1)
{
d[nx][ny][i]=d[x][y][dir]+1;
w=nx*n+ny;
q[rear++][0]=w;
q[rear-1][1]=i;
}
}
}
}
}
int min=inf;
for(i=0;i<4;i++)
if(d[y2-1][x2-1][i]<min)
min=d[y2-1][x2-1][i];
if(min>k)
printf("no\n");
else
printf("yes\n");
}
}
/*
input:
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
output:
no
yes
*/