您的位置:首页 > 其它

fzu2150——Fire Game(BFS)

2016-07-30 19:04 519 查看
题目要求从两个点开始BFS,一开始有点无从下手,但看了别人的解题报告后有了思路。

可以将这两个点看成从同一个超级源点出发,当然这个点在代码中没有直接体现,但这是个便于理解的方式。

#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAXN 1010
using namespace std;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
struct Node
{
int x,y,step;
};
int n,m,vis[20][20];
vector<Node> v;
char map[20][20];
int bfs(Node a,Node b,int s)
{
memset(vis,0,sizeof(vis));
queue<Node> q;
q.push(a),q.push(b);
vis[a.x][a.y]=vis[b.x][b.y]=1;
int ans=INF,sum;
if(a.x==b.x&&a.y==b.y)
sum=1;
else
sum=2;
while(!q.empty())
{
Node tmp=q.front(),tmp1;
q.pop();
//cout<<tmp.x<<" "<<tmp.y<<" "<<tmp.step<<endl;
ans=tmp.step;
for(int i=0; i<4; ++i)
{
tmp1=tmp;
tmp1.x=tmp.x+dx[i];
tmp1.y=tmp.y+dy[i];
if(tmp1.x>=0&&tmp1.x<n&&tmp1.y>=0&&tmp1.y<m&&!vis[tmp1.x][tmp1.y]&&map[tmp1.x][tmp1.y]=='#')
{
vis[tmp1.x][tmp1.y]=1;
sum++;
tmp1.step++;
q.push(tmp1);
}
}
}
//cout<<sum<<" "<<s<<endl;
if(sum==s)
return ans;
else
return INF;
}
int main()
{
ios::sync_with_stdio(false);
int t,cnt=1;
cin>>t;
while(t--)
{
int ans=INF,sum=0;
v.clear();
cin>>n>>m;
for(int i=0; i<n; ++i)
for(int j=0; j<m; ++j)
{
cin>>map[i][j];
if(map[i][j]=='#')
{
Node tmp;
tmp.x=i,tmp.y=j,tmp.step=0;
v.push_back(tmp);
sum++;
}
}
if(sum==0)
{
cout<<"Case"<<" "<<cnt++<<": "<<"0"<<endl;
continue;
}
for(int i=0; i<v.size(); ++i)
for(int j=0; j<v.size(); ++j)
{
ans=min(bfs(v[i],v[j],sum),ans);
}
if(ans==INF)
cout<<"Case"<<" "<<cnt++<<": "<<"-1"<<endl;
else
cout<<"Case"<<" "<<cnt++<<": "<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: