您的位置:首页 > 理论基础

upc4041:简单的图论?&&湖南省第十一届大学生计算机程序设计竞赛

2017-09-04 19:04 197 查看
中文题,题意不多说;
方法:优先队列+bfs
bfs1():求最优路径模板题;
bfs2():三维数组 viss[i][j][4],记录的是a[i][j]这一点的四个方向是否被走过,如果走过,就不用重复走;利用对step的赋值,记录当前点的父节点是否在此方向走过(必须要拐弯或后退,不能连着在同一方向走>=2步);
注意 如果不能走到那个点,就输出-1,在bfs里的return上一步 flag一下就行;代码虽然长,但是两个bfs基本重复,当模板题来做就可以^-^;

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
typedef long long ll;
ll xx,yy,ex,ey,m,n;
ll a[510][510],vis[510][510],viss[510][510][4];
int d[4][2]={1,0,0,1,-1,0,0,-1};
int flag1,flag2;
struct node{
ll x,y,value,step;
node (){
}
node(ll a,ll b,ll c)
{
x=a;
y=b;
value=c;
}
bool operator <(const node&p)const{
return value>p.value;
}
};
node st;
ll bfs1()
{
priority_queue<node>q;
memset(vis,0,sizeof(vis));
flag1=0;
node now;
while (!q.empty()) q.pop();
q.push(st);
vis[st.x][st.y]=1;
while (!q.empty())
{
node temp=q.top();
q.pop();
ll v=temp.value;
for (int i=0;i<4;i++)
{
now.x=temp.x+d[i][0];
now.y=temp.y+d[i][1];
now.value=a[now.x][now.y]+v;
if (now.x>=1&&now.x<=m&&now.y>=1&&now.y<=n&&vis[now.x][now.y]==0&&a[now.x][now.y]!=-1)
{
if (now.x==ex&&now.y==ey)
{
flag1=1;
return now.value;
}
vis[now.x][now.y]=1;
q.push(now);
}
}
}
}
ll bfs2()
{
priority_queue<node>q;
memset(viss,0,sizeof(viss));
flag2=0;
node now;
while (!q.empty()) q.pop();
q.push(st);
for (int i=0;i<4;i++)
viss[st.x][st.y][i]=1;
st.step=-1;
while (!q.empty())
{
node temp=q.top();
q.pop();
ll v=temp.value;
for (int i=0;i<4;i++)
{
now.x=temp.x+d[i][0];
now.y=temp.y+d[i][1];
now.value=a[now.x][now.y]+v;
if (now.x>=1&&now.x<=m&&now.y>=1&&now.y<=n&&viss[now.x][now.y][i]==0&temp.step!=i&&a[now.x][now.y]!=-1)
{
if (now.x==ex&&now.y==ey)
{
flag2=1;
return now.value;
}
viss[now.x][now.y][i]=1;
now.step=i;
q.push(now);
}
}
}
}
int main()
{
char s[510];
int k,ans=1;
while (cin>>m>>n>>xx>>yy>>ex>>ey)
{
memset(a,0,sizeof(a));
for (int i=1;i<=m;i++)//注意对要求数字的提取;给你的不一定规范,题中只说包含;
{
for (int j=1;j<=n;j++)
{
scanf("%s",s);
if (s[0]=='*')
a[i][j]=-1;
else
{
for (int k=0;k<strlen(s);k++)
{
if (s[k]<='9'&&s[k]>='0')
a[i][j]=a[i][j]*10+s[k]-'0';
}
}
}
}
st.x=xx;
st.y=yy;
st.value=a[xx][yy];
ll v1=bfs1();
ll v2=bfs2();
if (!flag1)
v1=-1;
if (!flag2)
v2=-1;
cout<<"Case "<<ans++<<": "<<v1<<" "<<v2<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 优先队列
相关文章推荐