原网址
广度搜索 比较麻烦的地方是加了一个查克拉,用book数组标记的时候将查克拉加上就ok 记得当时做的时候废了好长时间
两种方法,不多bb
AC代码
三维数组标记的
#include
#include
struct node
{
int x,y,step,num;
}q[40002];
int m,n,ck,sx,sy;
char map[202][202];
int book[202][202][20];
void bfs()
{
memset(book,0,sizeof(book));
int tx,ty,tz,head,tail;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
head=tail=1;
q[1].x=sx,q[1].y=sy,q[1].num=ck;q[1].step=0;
book[sx][sy][ck]=1;
tail++;
while(head<tail)
{
for(int i=0; i<4; i++)
{
int tx=q[head].x+dir[i][0];
int ty=q[head].y+dir[i][1];
int tz=q[head].num;
if(book[tx][ty][tz])
continue;
if(tx<0||tx>=n||ty<0||ty>=m)
continue;
if(map[tx][ty]=='*')
{
book[tx][ty][tz]=1;
q[tail].x=tx,q[tail].y=ty,q[tail].step=q[head].step+1,q[tail++].num=tz;
}
if(map[tx][ty]=='#'&&tz>0)
{
book[tx][ty][tz]=1;
q[tail].x=tx,q[tail].y=ty,q[tail].step=q[head].step+1,q[tail++].num=tz-1;
}
if(map[tx][ty]=='+')
{
printf("%d\n",q[head].step+1);
return;
}
}
head++;
}
printf("-1\n");
}
int main()
{
int flag=0;
scanf("%d%d%d",&n,&m,&ck);
for(int i=0;i<n;i++)
scanf("%s",map[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
sx=i;
sy=j;
flag=1;
break;
}
}
if(flag) break;
}
bfs();
return 0;
}
直接判断的
#include
#include
struct node
{
int x,y,num,time;
}q[40002];
int book[202][202];
char map[202][202];
int sx,sy,t,n,m;
int bfs()
{
memset(book,-1,sizeof(book));
book[sx][sy]=t;
int tail,head,tx,ty,tz;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
q[1].x=sx,q[1].y=sy,q[1].time=0,q[1].num=t;
head=tail=1;
tail++;
while(head<tail)
{
for(int i=0;i<4;i++)
{
tx=q[head].x+dir[i][0];
ty=q[head].y+dir[i][1];
tz=q[head].num;
if(tx<0||ty<0||tx>=n||ty>=m)
continue;
if(map[tx][ty]=='#'&&tz==0)
continue;
if(map[tx][ty]=='*'||map[tx][ty]=='+'||map[tx][ty]=='#')
{
if(map[tx][ty]=='#')
q[tail].num=tz-1;
else q[tail].num=tz;
if(q[tail].num>book[tx][ty])
{
book[tx][ty]=q[tail].num;
q[tail].x=tx;
q[tail].y=ty;
q[tail++].time=q[head].time+1;
}
if(map[tx][ty]=='+')
return q[tail-1].time;
}
}
head++;
}
return 0;
}
int main()
{
int i,j,key;
scanf("%d%d%d",&n,&m,&t);
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='@')
{
sx=i,sy=j;
break;
}
}
key=bfs();
if(key) printf("%d\n",key);
else printf("-1\n");
}