您的位置:首页 > 其它

HDU-2612(双BFS)

2012-10-04 20:42 274 查看
#include <stdio.h>
#include <cstring>
#define Max 0x7f7f7f7f
using namespace std;
int visited1[205][205];
int visited2[205][205];
int ans1[205][205];
int ans2[205][205];
int x1,y1,x2,y2;
int n,m;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[205][205];
struct node
{
int x;
int y;
};
node path[80000];
void bfs(int x ,int y,int ans[205][205],int visited[205][205])
{
memset(visited,0,sizeof(visited));
memset(ans,Max,sizeof(ans));
path[0].x=x;
path[0].y=y;
ans[x][y]=0;
int head=0;
int tail=1;
visited[x][y]=1;
while(head<tail)
{
x=path[head].x;
y=path[head].y;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(visited[xx][yy]==0 && xx>=0 && xx<n && yy>=0 && yy<m && map[xx][yy]!='#')
{
path[tail].x=xx;
path[tail].y=yy;
tail++;
ans[xx][yy]=ans[x][y]+1;
visited[xx][yy]=1;
}
}
head++;
}
}
int main()
{
char ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&ch);
map[i][j]=ch;
if(ch=='Y')
{
x1=i;
y1=j;
}
if(ch=='M')
{
x2=i;
y2=j;
}
}
getchar();
}
memset(visited1,0,sizeof(visited1));
memset(ans1,Max,sizeof(ans1));
bfs(x1,y1,ans1,visited1);
memset(visited2,0,sizeof(visited2));
memset(ans2,Max,sizeof(ans2));
bfs(x2,y2,ans2,visited2);
int min=Max;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='@'&& ans1[i][j]!=Max && ans2[i][j]!=Max)
{
if(min>ans1[i][j]+ans2[i][j])
min=ans1[i][j]+ans2[i][j];
}
}
}
printf("%d\n",min*11);
}

return 0;
}


好长时间都没有写过BFS了,,,手生的不行,,,看着别人的代码回忆自己的风格咯,,呼呼

写出来居然看不出哪里错了,,,看着和别人的代码一样呀...

贴出自己的:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
#define inf 0x3fffffff

using namespace std;

struct node{
int x;
int y;
int step;
}kfc[1001],info,pos;

int N,M;

char map[222][222];

int Y_x,Y_y;

int M_x,M_y;

int ans1[1001],ans2[1001],ans[1001];

int visit[222][222];

int dis[4][2]={0,1,1,0,0,-1,-1,0};

int cnt;

int judge(node t)
{
if(t.x<1||t.x>N||t.y<1||t.y>M||map[t.x][t.y]=='#')
return 0;
else
return 1;
}

void BFS_Y(int x,int y)
{
queue <node > q;
memset(visit,0,sizeof(visit));
memset(ans1,-1,sizeof(ans1));
info.x=x;
info.y=y;
info.step=0;
q.push(info);
visit[x][y]=1;
while(!q.empty())
{
node t;
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
pos.x=t.x+dis[i][0];
pos.y=t.y+dis[i][1];
pos.step=t.step;
if(!visit[pos.x][pos.y]&&judge(pos))
{
visit[pos.x][pos.y]=1;
if(map[pos.x][pos.y]=='.')
{
pos.step++;
q.push(pos);
}
else if(map[pos.x][pos.y]=='@')
{
for(int i=1;i<cnt;i++)
{
if(kfc[i].x==pos.x&&kfc[i].y==pos.y)
{
ans1[i]=pos.step+1;
//	printf("%d_____%d\n",i,ans1[i]);
break;
}
}
}
}
}
}
}

void BFS_M(int x,int y)
{
queue <node > q;
memset(visit,0,sizeof(visit));
memset(ans2,-1,sizeof(ans2));
info.x=x;
info.y=y;
info.step=0;
q.push(info);
visit[x][y]=1;
while(!q.empty())
{
node t;
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
pos.x=t.x+dis[i][0];
pos.y=t.y+dis[i][1];
pos.step=t.step;
if(!visit[pos.x][pos.y]&&judge(pos))
{
visit[pos.x][pos.y]=1;
if(map[pos.x][pos.y]=='.')
{
pos.step++;
q.push(pos);
}
else if(map[pos.x][pos.y]=='@')
{
for(int i=1;i<cnt;i++)
{
if(kfc[i].x==pos.x&&kfc[i].y==pos.y)
{
ans2[i]=pos.step+1;
//	printf("%d_____%d\n",i,ans2[i]);
break;
}
}
}
}
}
}
}

int main()
{
while(scanf("%d%d",&N,&M)!=EOF)
{
cnt=1;
for(int i=1;i<=N;i++)
{
scanf("%s",map[i]+1);
for(int j=1;j<=M;j++)
{
if(map[i][j]=='Y')
{
Y_x=i;
Y_y=j;
}
else if(map[i][j]=='M')
{
M_x=i;
M_y=j;
}
else if(map[i][j]=='@')
{
kfc[cnt].x=i;
kfc[cnt].y=j;
//	printf("cnt=%d    %d****%d  \n",cnt,kfc[cnt].x,kfc[cnt].y);
cnt++;
}
}
}
BFS_Y(Y_x,Y_y);
BFS_M(M_x,M_y);
int Min=inf;
for(i=1;i<cnt;i++)
{
//	printf("ans1====%d______ans2=%d  \n",ans1[i],ans2[i]);
if(ans1[i]!=-1&&ans2[i]!=-1)
{
int t=ans1[i]+ans2[i];
if(t<Min)
Min=t;
}
}
printf("%d\n",Min*11);
}
return 0;
}


 

 

 

然后是别人的:

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  path include struct ini im c