现在的位置: 首页 > 综合 > 正文

HDU-2612(双BFS)

2013年12月14日 ⁄ 综合 ⁄ 共 3353字 ⁄ 字号 评论关闭

#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;
}

			


 

 

 

然后是别人的:

 

 

抱歉!评论已关闭.