3 5 6 3 XXD... ....E. ....X. ....S. ...... 5 6 3 XDX... ....E. ...... ....S. ...... 5 6 8 XXDX.. .XEX.. ...... ....S. ......Sample Output
Case 1: -1 Case 2: 3 Case 3: -1
要注意的是:因为路径可以重复,要用四维数组来标记,除了记录位置外还要记录此时的状态,其余的直接用广搜的模板就行了。
代码:
#include
#include
#include
#include
using namespace std;
char map[105][105];
int n,m,t,sx,sy;
int go[4][2]={0,1,0,-1,1,0,-1,0},vis[3][3][105][105];
struct node
{
int x,y,d,e,s;
}no,ne;
void pan(node &p)
{
for(int i=p.x-1;i>=0;i--)
{
if(map[i][p.y]=='D'){p.d=1;break;}
else if(map[i][p.y]=='E'){p.e=1;break;}
else if(map[i][p.y]=='X')break;
}
for(int i=p.x+1;i=0;i--)
{
if(map[p.x][i]=='D'){p.d=1;break;}
else if(map[p.x][i]=='E'){p.e=1;break;}
else if(map[p.x][i]=='X')break;
}
for(int i=p.y+1;iw;
no.x=sx,no.y=sy;
no.e=0,no.d=0,no.s=0;
pan(no);
w.push(no);
while(!w.empty())
{
no=w.front();
w.pop();
pan(no);
if(no.d&&no.e)
return no.s;
for(int i=0;i<4;i++)
{
int xx=no.x+go[i][0];
int yy=no.y+go[i][1];
ne.d=no.d,ne.e=no.e;
if(xx<0||xx>=n||yy<0||yy>=m||vis[ne.d][ne.e][xx][yy]||map[xx][yy]!='.'||no.s+1>t)
continue;
ne.x=xx,ne.y=yy,ne.s=no.s+1;
vis[ne.d][ne.e][xx][yy]=1;
w.push(ne);
}
}
return -1;
}
int main()
{
int l,k=1;
scanf("%d",&l);
while(l--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&m,&t);
for(int i=0;i