3 5 6 3 XXD... ....E. ....X. ....S. ...... 5 6 3 XDX... ....E. ...... ....S. ...... 5 6 8 XXDX.. .XEX.. ...... ....S. ......
Case 1: -1 Case 2: 3 Case 3:-1
这题用的是宽搜,其中有个地方要注意,一个位置走过,下次可能还可以走这个位置,但是要满足下次走的这个位置的状态和这次不同,可以用vis[i][j][num2][num3](num2<2 && num3<2)表示是不是经过这个位置且状态是(num2,num3),num2,num3分别代表(x2,y2),(x3,y3)是不是已经看到过。判断是否看到过,可以先预处理一下,用vis2[i][j]判断在(i,j)点是不是能看到(x2,y2),用vis3[i][j]判断在(i,j)点是不是能看到(x3,y3).
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define ll long long #define inf 99999999 #define maxn 106 char gra[maxn][maxn]; int vis[maxn][maxn][2][2],vis2[maxn][maxn],vis3[maxn][maxn]; int q[111111][5]; int n,m,x1,y1,x2,y2,x3,y3,shijian,ans; int tab[6][2]={0,1,-1,0,0,-1,1,0}; void init() { int i,j; memset(vis3,0,sizeof(vis3)); memset(vis2,0,sizeof(vis2)); for(i=x2-1;i>=1;i--){ if(gra[i][y2]!='X'&& gra[i][y2]!='E'){ vis2[i][y2]=1; } else break; } for(i=x2+1;i<=n;i++){ if(gra[i][y2]!='X'&& gra[i][y2]!='E'){ vis2[i][y2]=1; } else break; } for(j=y2-1;j>=1;j--){ if(gra[x2][j]!='X' && gra[x2][j]!='E'){ vis2[x2][j]=1; } else break; } for(j=y2+1;j<=m;j++){ if(gra[x2][j]!='X'&& gra[x2][j]!='E'){ vis2[x2][j]=1; } else break; } for(i=x3-1;i>=1;i--){ if(gra[i][y3]!='X'&& gra[i][y3]!='D'){ vis3[i][y3]=1; } else break; } for(i=x3+1;i<=n;i++){ if(gra[i][y3]!='X'&& gra[i][y3]!='D'){ vis3[i][y3]=1; } else break; } for(j=y3-1;j>=1;j--){ if(gra[x3][j]!='X'&& gra[x3][j]!='D'){ vis3[x3][j]=1; } else break; } for(j=y3+1;j<=m;j++){ if(gra[x3][j]!='X'&& gra[x3][j]!='D'){ vis3[x3][j]=1; } else break; } } void bfs() { int i,j,front,rear,num2,num3; int x,y,xx,yy,t,tt; front=rear=0; q[rear][0]=x1;q[rear][1]=y1;q[rear][2]=0;q[rear][3]=0;q[rear][4]=0; vis[x1][y1][0][0]=1; while(front<=rear){ x=q[front][0];y=q[front][1];t=q[front][2];num2=q[front][3];num3=q[front][4]; front++; if(vis2[x][y])num2=1; if(vis3[x][y])num3=1; if(num2==1 && num3==1){ ans=t;break; } if(t>=shijian)continue; for(i=0;i<4;i++){ xx=x+tab[i][0]; yy=y+tab[i][1]; if(xx>=1 && xx<=n && yy>=1 && yy<=m && !vis[xx][yy][num2][num3] && gra[xx][yy]!='X' && gra[xx][yy]!='D' && gra[xx][yy]!='E'){ vis[xx][yy][num2][num3]=1; rear++; q[rear][0]=xx;q[rear][1]=yy;q[rear][2]=t+1;q[rear][3]=num2;q[rear][4]=num3; } } } } int main() { int i,j,T,num1=0; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&shijian); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++){ scanf("%s",gra[i]+1); for(j=1;j<=m;j++){ if(gra[i][j]=='S'){ x1=i;y1=j; } else if(gra[i][j]=='D'){ x2=i;y2=j; } else if(gra[i][j]=='E'){ x3=i;y3=j; } } } init(); ans=inf; bfs(); num1++; printf("Case %d:\n",num1); if(ans==inf)printf("-1\n"); else printf("%d\n",ans); } return 0; }