您的位置:首页 > 其它

HDU 4771 (DFS+BFS)

2015-10-27 23:28 375 查看
[align=left]Problem Description[/align]
  Harry Potter has some precious. For example, his invisible robe, his wand and his owl. When Hogwarts school is in holiday, Harry Potter has to go back to uncle Vernon's home. But he can't bring his precious with him. As you know, uncle Vernon never allows such magic things in his house. So Harry has to deposit his precious in the Gringotts Wizarding Bank which is owned by some goblins. The bank can be considered as a N × M grid consisting of N × M rooms. Each room has a coordinate. The coordinates of the upper-left room is (1,1) , the down-right room is (N,M) and the room below the upper-left room is (2,1)..... A 3×4 bank grid is shown below:

#include<bits/stdc++.h>
using namespace std;
char a[105][105];
int mp[105][105];
map<int,int>flag;
int mpp[105][105];
int shorpath[6][2];
int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m;
int k;
int s_x,s_y;
int parent[30];
int jishu=0;
int A[6][6];
int re=100000;
int sum;
struct node
{
int x;
int y;
int step;
};
int Find(int n)
{
if(n!=parent
)
n=Find(parent
);
return n;
}
void unio( int ss,int bb)
{
ss=Find(ss);
bb=Find(bb);
if(ss!=bb)
parent[ss]=bb;
}
queue<node>q;
node N,now;
void init_()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mpp[i][j]=mp[i][j];
}
int bfs(int a,int b,int c,int d)
{
init_();
while(!q.empty())
{
q.pop();
}
N.x=a;
N.y=b;
N.step=0;
q.push(N);
mpp[a][b]=0;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==c&&now.y==d)
return now.step;
for(int i=0;i<4;i++)
{
int aa=now.x+dis[i][0];
int bb=now.y+dis[i][1];
if(aa>0&&aa<=n&&bb>0&&bb<=m&&mpp[aa][bb])
{
mpp[aa][bb]=0;
N.x=aa;
N.y=bb;
N.step=now.step+1;
q.push(N);
}
}
}
return -1;
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mp[i][j]=0;
for(int i=0;i<=30;i++)
parent[i]=i;
re=100000;
}
/*void kruskal()
{
int re=0;
for(int i=0;i<jishu;i++)
{
int qq=A[i].s;
int ww=A[i].e;
//cout<<re<<endl;
if(Find(qq)!=Find(ww))
{
unio(qq,ww);
re+=A[i].x;
}
}
printf("%d\n",re);
}*/
void dfs(int n,int ce)
{
if(ce==k)
{
if(sum<re)
{
re=sum;
}
//printf("%d\n",re);
return ;
}
for(int i=0;i<=k;i++)
{
if(i!=n&&flag[i]==0)
{
sum+=A
[i];
flag[i]=1;
dfs(i,ce+1);
sum-=A
[i];
flag[i]=0;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
init();
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
{
s_x=i;
s_y=j;
}
if(a[i][j]=='.'||a[i][j]=='@')
mp[i][j]=1;
}
getchar();
}
scanf("%d",&k);
shorpath[0][0]=s_x;
shorpath[0][1]=s_y;
for(int i=1;i<=k;i++)
scanf("%d%d",&shorpath[i][0],&shorpath[i][1]);
jishu=0;
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++)
{
A[i][j]=bfs(shorpath[i][0],shorpath[i][1],shorpath[j][0],shorpath[j][1]);
}
sum=0;
flag[0]=1;
dfs(0,0);
printf("%d\n",re);

}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: