hdu2612 Find a way 广搜

来源:互联网 发布:xampp mysql登陆 编辑:程序博客网 时间:2024/05/04 22:15

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

题意: 有Y,M两个人,和若干个目的地“@”,求两个人到同一个“@”的最小时间(两个人到“@”的时间之和)。

第一次做这道的时候错了,因为没有考虑到下面这种情况

3 3

Y#@

.M#

@..

根据我的计算方法;这样输出的是0而不是44;

随后根据我的计算时间的方法改了一下,AC;

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;int N,M,vism[205][205],visy[205][205],step[205][205];char map[205][205];struct node{int y,x,step,who;}y,m,ic,tmp;int fx[4][2]={{0,1},{0,-1},{-1,0},{1,0}};void bfs(){memset(vism,0,sizeof(vism));memset(visy,0,sizeof(visy));//memset(step,0,sizeof(step));memset(step,-1,sizeof(step));queue<node>q;q.push(y),q.push(m);visy[y.y][y.x]=1;vism[m.y][m.x]=1;while(!q.empty()){ic=q.front();q.pop();if(map[ic.y][ic.x]=='@'){step[ic.y][ic.x]+=ic.step;}for(int i=0;i<4;++i){tmp.y=ic.y+fx[i][1];tmp.x=ic.x+fx[i][0];tmp.step=ic.step+1;tmp.who=ic.who;if(map[tmp.y][tmp.x]=='#'||tmp.y<0||tmp.x<0||tmp.y>=N||tmp.x>=M)continue;if(tmp.who){if(visy[tmp.y][tmp.x])continue;else visy[tmp.y][tmp.x]=1;}else    {    if(vism[tmp.y][tmp.x])continue;else vism[tmp.y][tmp.x]=1;}q.push(tmp);}}}int main(){while(cin>>N>>M){for(int i=0;i<N;++i){scanf("%s",&map[i]);for(int j=0;j<M;++j){if(map[i][j]=='Y'){y.y=i;y.x=j;y.step=0;y.who=1; }if(map[i][j]=='M'){m.y=i;m.x=j;m.step=0;m.who=0;}}}bfs();int ans=1e9;for(int i=0;i<N;++i)    for(int j=0;j<M;++j)    if(map[i][j]=='@'&&step[i][j]!=-1&&step[i][j]<ans)   ans=step[i][j];cout<<(ans+1)*11<<endl;}}



0 0
原创粉丝点击