upc4041:简单的图论?&&湖南省第十一届大学生计算机程序设计竞赛
2017-09-04 19:04
197 查看
中文题,题意不多说;
方法:优先队列+bfs
bfs1():求最优路径模板题;
bfs2():三维数组 viss[i][j][4],记录的是a[i][j]这一点的四个方向是否被走过,如果走过,就不用重复走;利用对step的赋值,记录当前点的父节点是否在此方向走过(必须要拐弯或后退,不能连着在同一方向走>=2步);
注意 如果不能走到那个点,就输出-1,在bfs里的return上一步 flag一下就行;代码虽然长,但是两个bfs基本重复,当模板题来做就可以^-^;
方法:优先队列+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; }
相关文章推荐
- HNNU 11657 简单的图论问题?【湖南省第十一届大学生计算机程序设计竞赛,双BFS】
- CSU Problem 1780 简单的图论问题?——湖南省第十一届大学生计算机程序设计竞赛
- 湖南省第十一届大学生计算机程序设计竞赛 简单的图论问题?
- 2015关于第十一届"蓝狐网络杯"湖南省大学生计算机程序设计竞赛的总结
- 湖南省第十一届大学生计算机程序设计竞赛—E - 又一道简单题
- HNNU 11662 又一道简单题【湖南省第十一届大学生计算机程序设计竞赛,模拟,暴力】
- CSU Problem 1785 又一道简单题——湖南省第十一届大学生计算机程序设计竞赛
- Internet of Lights and Switches湖南省第十一届大学生计算机程序设计竞赛
- 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛
- CSU Problem 1777 大还是小?——湖南省第十一届大学生计算机程序设计竞赛
- 湖南省第十一届大学生计算机程序设计竞赛(阶乘除法)
- HNNU 11654 大还是小?【 湖南省第十一届大学生计算机程序设计竞赛,Java大数比较】
- CSU Problem 1781 阶乘除法——湖南省第十一届大学生计算机程序设计竞赛
- CSU 1781: 阶乘除法 (思维) 湖南省第十一届大学生计算机程序设计竞赛
- 湖南省第十一届大学生计算机程序设计竞赛 部分题解 待续
- HNNU 11656 错误的算法【 湖南省第十一届大学生计算机程序设计竞赛,模拟】
- CSU Problem 1779 错误的算法——湖南省第十一届大学生计算机程序设计竞赛
- 湖南省第十一届大学生计算机程序设计竞赛 A,B,C,D,F,H,J 题解
- 湖南省第十一届大学生计算机程序设计竞赛 错误的算法
- 湖南省第十一届大学生计算机程序设计竞赛—错误的算法