hangzhou 02

#include<stdio.h>
#include<queue>
#include<utility>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;

const int INF=12345678;
int n,m;
struct P
{
	int x,y;
	P(int a,int b)
	{
		x=a;
		y=b;
	}
	P(){}
};
int b[200][200];
queue<P> q;
int num_pre;
P pos[5];
int minStep[5][5];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int color[200][200];
int d[200][200];
void bfs(int s)
{
	q.push(P(pos[s].x,pos[s].y));
	while(!q.empty())
	{
		P t=q.front();
		q.pop();
		int x=t.x;
		int y=t.y;
		if(color[x][y]==0)
		{
			color[x][y]=1;
			for(int i=0;i<4;i++)
			{
				int tx=x+dx[i];
				int ty=y+dy[i];
				if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&color[tx][ty]==0&&b[tx][ty]!=1)
				{

					d[tx][ty]=d[x][y]+1;
					if(b[tx][ty]==3)
					{
						for(int o=1;o<=num_pre;o++)
						{
							if(pos[o].x==tx&&pos[o].y==ty)
							{
								minStep[s][o]=d[tx][ty];
								minStep[o][s]=d[tx][ty];
							}
						}
					}
					q.push(P(tx,ty));
				}
			}
		}
	}
}
int main()
{	
	while(scanf("%d%d",&n,&m)&&((m!=0)||(n!=0)))
	{
		char row[200];
		P s;
		for(int i=1;i<=n;i++)
		{
			scanf("%s",row);
			for(int j=0;j<m;j++)
			{
				if(row[j]=='#')
					b[i][j+1]=1;
				if(row[j]=='.')
					b[i][j+1]=0;
				if(row[j]=='@')
				{
					s.x=i;
					s.y=j+1;
					b[s.x][s.y]=0;
				}	
			}
		}

		scanf("%d",&num_pre);
		bool flag=false;
		for(int i=1;i<=num_pre;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			pos[i].x=x;
			pos[i].y=y;
			if(b[x][y]==0)
			{
				b[x][y]=3;
			}
			if(b[x][y]==1)
			{
				flag=true;
				break;
			}
		}
		if(flag)
		{
			printf("1111\n");
			continue;
		}
		pos[0].x=s.x;
		pos[0].y=s.y;
		for(int i=0;i<=num_pre;i++)
		{
			for(int j=0;j<=num_pre;j++)
				minStep[i][j]=INF;
		}
		for(int i=0;i<=num_pre;i++)
		{	
			while(!q.empty()) q.pop();
			memset(color,0,sizeof(color));
			for(int ii=0;ii<200;ii++)
				for(int j=0;j<200;j++)
					d[ii][j]=INF;
			d[pos[i].x][pos[i].y]=0;
			bfs(i);
		}
		bool flag2=false;
		for(int i=1;i<=num_pre;i++)
		{
			if(minStep[0][i]==INF)
			{
				flag2=true;
				break;
			}
		}
		if(flag2)
		{
			printf("-1\n");
			continue;
		}
		int permu[5];
		for(int i=1;i<=num_pre;i++)
			permu[i]=i;
		int min_=INF;
		do
		{
			int sum=0;
			int be,ne;
			be=0;ne=permu[1];
			for(int i=1;i<=num_pre;i++)
			{
				ne=permu[i];
				sum+=minStep[be][ne];
				be=ne;
			}
			if(min_>sum)
				min_=sum;
		}while(next_permutation(permu+1,permu+num_pre+1));
		printf("%d\n",min_);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章