hdu 4528(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528
思路:结构体里面不仅要记录x,y,time,还要有2个bool型来记录是否看到二明和大明,因此,对于状态判重,开个4位数组mark[x][y][tag1][tag2],因为根据看到的人不同,我这个点(x,y)还是可以 重复走的,最后就是关于怎么来判断看到的人了,这儿我用了最暴力的方法,就是一开始的时候记录二明和大明所在的位置,然后将其改为'X',因为这两个位置小明是不能走的。然后就是如果横坐标相同,就y方向上看能否看到(同理)。如果对于当前节点p有p.tag1=p.tag2=true,那么就要更新时间了。具体还是看代码吧。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define MAXN 111 7 #define inf 1<<30 8 struct Node{ 9 int x,y; 10 int time; 11 bool tag1,tag2; 12 }; 13 int n,m,time,ans; 14 Node st,ed1,ed2; 15 char map[MAXN][MAXN]; 16 bool mark[MAXN][MAXN][2][2]; 17 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 18 19 bool Judge(Node &p){ 20 int x=p.x,y=p.y; 21 if(x==ed1.x){ 22 for(int i=y+1;i<=m;i++){ 23 if(ed1.y==i){ p.tag1=true;break; } 24 else if(map[x][i]=='X')break; 25 } 26 for(int i=y-1;i>=1;i--){ 27 if(ed1.y==i){ p.tag1=true;break; } 28 else if(map[x][i]=='X')break; 29 } 30 } 31 if(x==ed2.x){ 32 for(int i=y+1;i<=m;i++){ 33 if(ed2.y==i){ p.tag2=true;break; } 34 else if(map[x][i]=='X')break; 35 } 36 for(int i=y-1;i>=1;i--){ 37 if(ed2.y==i){ p.tag2=true;break; } 38 else if(map[x][i]=='X')break; 39 } 40 } 41 if(y==ed1.y){ 42 for(int i=x+1;i<=n;i++){ 43 if(ed1.x==i){ p.tag1=true;break; } 44 else if(map[i][y]=='X')break; 45 } 46 for(int i=x-1;i>=1;i--){ 47 if(ed1.x==i){ p.tag1=true;break; } 48 else if(map[i][y]=='X')break; 49 } 50 } 51 if(y==ed2.y){ 52 for(int i=x+1;i<=n;i++){ 53 if(ed2.x==i){ p.tag2=true;break; } 54 else if(map[i][y]=='X')break; 55 } 56 for(int i=x-1;i>=1;i--){ 57 if(ed2.x==i){ p.tag2=true;break; } 58 else if(map[i][y]=='X')break; 59 } 60 } 61 if(p.tag1&&p.tag2)return true; 62 return false; 63 } 64 65 66 void bfs(){ 67 memset(mark,false,sizeof(mark)); 68 queue<Node>Q; 69 Node p,q; 70 mark[st.x][st.y][st.tag1][st.tag2]=true; 71 Q.push(st); 72 while(!Q.empty()){ 73 p=Q.front(); 74 Q.pop(); 75 if(Judge(p))ans=min(ans,p.time); 76 if(p.time>time)continue; 77 for(int i=0;i<4;i++){ 78 q=p; 79 q.x=p.x+dir[i][0]; 80 q.y=p.y+dir[i][1]; 81 if(q.x<1||q.x>n||q.y<1||q.y>m||map[q.x][q.y]=='X') 82 continue; 83 if(!mark[q.x][q.y][q.tag1][q.tag2]){ 84 mark[q.x][q.y][q.tag1][q.tag2]=true; 85 q.time++; 86 Q.push(q); 87 } 88 } 89 } 90 } 91 92 int main(){ 93 int _case,t=1; 94 scanf("%d",&_case); 95 while(_case--){ 96 scanf("%d%d%d",&n,&m,&time); 97 for(int i=1;i<=n;i++){ 98 scanf("%s",map[i]+1); 99 for(int j=1;j<=m;j++){ 100 if(map[i][j]=='S'){ 101 map[i][j]=='.'; 102 st.x=i,st.y=j,st.tag1=st.tag2=false,st.time=0; 103 }else if(map[i][j]=='E'){ 104 ed1.x=i,ed1.y=j; 105 map[i][j]='X'; 106 }else if(map[i][j]=='D'){ 107 map[i][j]='X'; 108 ed2.x=i,ed2.y=j; 109 } 110 } 111 } 112 ans=inf; 113 bfs(); 114 printf("Case %d:\n",t++); 115 if(ans<=time){ 116 printf("%d\n",ans); 117 }else 118 puts("-1"); 119 } 120 return 0; 121 }