杭州站现场赛题目重现的B题,昨天下午做了一下,现在发个题解,最多也就四个宝物,所以 直接暴力模拟就可以了,但是一开始一直wa,案例自己写了几十个都过了,没办法后来改成了 dfs来枚举
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define LL __int64
#define eps 1e-8
//const ll INF=9999999999999;
#define inf 0xfffffff
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p;
//
//vector<int>G[30012];
struct Node
{
int x;
int y;
Node(){}
Node(int x,int y):x(x),y(y){}
void init()
{
scanf("%d%d",&x,&y);
x--;
y--;
}
}node[112];
int n,m,k;
int dis[10][10];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int d[101][101];
typedef pair<Node,int> pni;
bool vis[112][112];
char mp[112][112];
bool isright(int x,int y)
{
if(x>=0 && x<n && y>=0 && y<m && mp[x][y]!='#')
return 1;
return 0;
}
void BFS(Node S,int T)
{
queue<pni>Q;
Q.push(make_pair(S,0));
memset(vis,0,sizeof(vis));
memset(d,-1,sizeof(d));
while(!Q.empty())
{
pni u=Q.front();Q.pop();
for(int i=0;i<4;i++)
{
int xx=u.first.x+dx[i],yy=u.first.y+dy[i];
int len=u.second;
if(isright(xx,yy) && !vis[xx][yy])
{
d[xx][yy]=len+1;
vis[xx][yy]=1;
Q.push(make_pair(Node(xx,yy),len+1));
}
}
}
for(int i=0;i<=k;i++)
{
int xx=node[i].x,yy=node[i].y;
dis[T][i]=d[xx][yy];
}
}
bool state[10];
int ans;
void DFS(int p,int len,int dep)
{
if(dep==k)
{
if(len<ans)
{
ans=len;
}
return ;
}
for(int i=0;i<=k;i++)
{
if(!state[i]){
state[i]=1;
DFS(i,len+dis[p][i],dep+1);
state[i]=0;
}
}
}
int main()
{
while(scanf("%d %d",&n,&m),n+m)
{
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(mp[i][j]=='@')
node[0]=Node(i,j);
scanf("%d",&k);
for(int i=1;i<=k;i++)
node[i].init();
BFS(node[0],0);
int flag=1;
for(int i=0;i<=k;i++)
if(dis[0][i]==-1)
{
printf("-1\n");
flag=0;
break;
}
if(!flag)
continue;
for(int i=1;i<=k;i++)
BFS(node[i],i);
memset(state,0,sizeof(state));
state[0]=1;
ans=inf;
DFS(0,0,0);
printf("%d\n",ans);
}
return 0;
}