AOJ 579

来源:互联网 发布:烘焙论坛知乎 编辑:程序博客网 时间:2024/04/29 22:12
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 32 MB
Total Submission: 262   Submission Accepted: 38
Description
平时不努力,考试得着急呐。传说中的BT监考老师竟然搬来了信号屏蔽工具,手机不管用啦有木有。不过这难不到大家,cxlove见证了同学们使用传统的作弊方式----传纸条,纸条得从A同学传到B同学处,在一个N*M的教室里,零散着坐着一些同学,监考老师游荡在教室某些位置,能否成功将纸条传到B同学处,且不被老师发现。每一次传纸条不能斜传,只能传给前后左右四个同学,监考老师的监视范围为相邻的八个位置,当纸条传到老师监视范围内就会被逮住了,纸条传到空位置处时传送失败。 帮cxlove计算下最少需要多少时间才能完成传纸条。

Input
多组测试数据
第一行两个整数,N,M(1<=N,M<=100),分别表示教室有N*M个位置接下来N行,每行M个字符,表示教室的情况
'A'表示纸条的初始位置,'B'表示纸条的目标位置,'.'表示一般同学的位置,'#'表示当前位置没有人坐,'T'表示监考老师。(可能有多个监考老师)

Output
输出仅一个整数,表示需要的最少时间传到B同学处
如果不能传达,输出-1

Sample Input
OriginalTransformed
5 5A.T...#..#.....####.....B1 5A.T.B
5[SP]5[EOL] A.T..[EOL] .#..#[EOL] .....[EOL] ####.[EOL] ....B[EOL] 1[SP]5[EOL] A.T.B[EOL] [EOF] 

Sample Output
OriginalTransformed
8-1
8[EOL] -1[EOL] [EOF] 
--------------------------------------分割线----------------------------------
思路:简单的bfs,适合初学者
#include<iostream>#include<cstring>using namespace std;int n,m;int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};char map[105][105];int ans[105][105];typedef struct{int x;int y;}node;int bfs(node s,node e){node que[10005];node t,tt;int head=0,rear=0;map[s.x][s.y]='#';que[rear++]=s;while(head<rear){t=que[head++];for(int i=0;i<4;i++){tt.x=t.x+dir[i][0];tt.y=t.y+dir[i][1];if(tt.x>=0&&tt.x<n&&tt.y>=0&&tt.y<m&&map[tt.x][tt.y]!='#'){que[rear++]=tt;map[tt.x][tt.y]='#';ans[tt.x][tt.y]=ans[t.x][t.y]+1;if(tt.x==e.x&&tt.y==e.y){return ans[tt.x][tt.y];}}}}return 0;}int main(){int i,j;node s,e;char ch;while(cin>>n>>m){memset(map,0,sizeof(map));memset(ans,0,sizeof(ans));for(i=0;i<n;i++){for(j=0;j<m;j++){cin>>ch;if(ch=='A'){s.x=i;s.y=j;}else if(ch=='B'){e.x=i;e.y=j;}else if(ch=='T'){for(int k1=i-1;k1<=i+1;k1++){for(int k2=j-1;k2<=j+1;k2++){if(k1>=0&&k1<n&&k2>=0&&k2<m)map[k1][k2]='#';}}}if(map[i][j]!='#'){map[i][j]=ch;}}}if(map[e.x][e.y]=='#'||map[s.x][s.y]=='#')           //剪枝{cout<<"-1"<<endl;continue;}else {int t=bfs(s,e);if(t)cout<<t<<endl;else cout<<"-1"<<endl;}}return 0;} 


0 0