hangzhou 02

来源:互联网 发布:帝国cms技巧 编辑:程序博客网 时间:2024/05/16 15:29
#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_);}}