hdu2579: http://acm.hdu.edu.cn/showproblem.php?pid=2579
题意:“#”代表石头,如果走的步数是k的倍数,石头会消失,求最小时间(步数)
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int inf=1<<29;
char v[150][150];
int q[150*150*150][2],dist[150][150][20];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int main()
{
int i,j,z,rear,front,t,r,c,k,start,gi,gj,u,w,x,y,nx,ny,time;
scanf("%d",&t);
while(t--)
{
for(i=0;i<150;i++)
for(j=0;j<150;j++)
for(z=0;z<20;z++)
dist[i][j][z]=inf;
scanf("%d%d%d",&r,&c,&k);
getchar();
for(i=0;i<r;i++)
{
gets(v[i]);
for(j=0;j<c;j++)
{
if(v[i][j]=='Y')
{
start=i*c+j;
dist[i][j][0]=0;
}
if(v[i][j]=='G')
{
gi=i;gj=j;
}
}
}
rear=0;front=0;
q[rear++][0]=start;q[rear-1][1]=0;
while(front<rear)
{
u=q[front++][0];
x=u/c;y=u%c;time=q[front-1][1];
for(i=0;i<4;i++)
{
nx=x+dx[i];ny=y+dy[i];
if(nx>=0&&nx<r&&ny>=0&&ny<c&&(((time+1)%k==0)&&(v[nx][ny]=='#')||v[nx][ny]!='#'))
{
if(dist[nx][ny][(time+1)%k]>dist[x][y][time%k]+1)
{
dist[nx][ny][(time+1)%k]=dist[x][y][time%k]+1;
w=nx*c+ny;
q[rear++][0]=w;
q[rear-1][1]=(time+1)%k;
}
}
}
}
int min=inf;
for(i=0;i<20;i++)
if(dist[gi][gj][i]<min)
min=dist[gi][gj][i];
if(min==inf)
printf("Please give me another chance!\n");
else
printf("%d\n",min);
}
}
/*
input:
1
6 6 2
...Y..
...#..
.#....
...#..
...#..
..#G#.
output:
7
*/