#include<bits/stdc++.h>
using namespace std;
const int N=105;
char ch[N][N];int n,m,k;
map<pair<int,int>,int> mp;
int vis[1<<4][N][N];
struct node{
int x,y,st;
};
int d1[4]={1,-1,0,0},d2[4]={0,0,1,-1};
int bfs(int x,int y){
queue<node> q;
q.push({x,y,0});
vis[0][x][y]=1;
while(q.size()){
node tp=q.front();q.pop();
if(tp.st==(1<<k)-1) return vis[tp.st][tp.x][tp.y]-1;
for(int i=0;i<=3;i++){
int tx=tp.x+d1[i],ty=tp.y+d2[i],nowst=tp.st;
// cout<<tp.x<<" "<<tp.y<<" ";
// cout<<tx<<" "<<ty<<endl;
if(tx<=0||tx>n||ty<=0||ty>m||ch[tx][ty]=='#') continue;
if(mp[{tx,ty}]){
nowst=nowst|(1<<((mp[{tx,ty}]-1)));
}
// cout<<nowst<<endl;
if(vis[nowst][tx][ty]) continue;
vis[nowst][tx][ty]=vis[tp.st][tp.x][tp.y]+1;
q.push({tx,ty,nowst});
}
}
return -1;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++) cin>>ch[i]+1;
scanf("%d",&k);
mp.clear();memset(vis,0,sizeof vis);
for(int i=0;i<k;i++){
int x,y;scanf("%d%d",&x,&y);
mp[{x,y}]=i+1;
}
int st,ed;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ch[i][j]=='@'){
st=i;ed=j;
break;
}
}
}
int ans=bfs(st,ed);
cout<<ans<<endl;
}
}
G - Stealing Harry Potter‘s Precious(bfs+状态压缩
最新推荐文章于 2022-03-14 18:13:28 发布