#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_);
}
}
hangzhou 02
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.