广度优先搜索BFS蓝桥杯(C/C++)数字三角形
题目描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入描述
输入的第一行包含一个整数N(1≤N≤100),表示三角形的行数。
下面的N行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
解题思路:
使用广度优先搜索BFS从顶点开始遍历,记录x坐标、y坐标、累加和、向左、向右步数,如果满足向左、向右步数相减绝对值小于等于1,x等于N-1,累加和大于上一次满足条件,则更换最大值,这里因为使用BFS所以只能解决50%测试用例。
参考代码:
#include<iostream>
#include<queue>
using namespace std;
const int M=101;
int N;
int Max=0;
int Map[M][M];
int mv[2][2]={{1,0},{1,1}};
struct Node{
int x,y;
int accumulation;
int Left,Right;
Node(int _x,int _y,int _accumulation,int _Left,int _Right){
x=_x;y=_y;
accumulation=_accumulation;
Left=_Left;Right=_Right;
}
};
int main(){
queue<Node>q;
cin>>N;
for(int i=0;i<N;i++){
for(int j=0;j<i+1;j++){
cin>>Map[i][j];
}
}
q.push(Node(0,0,Map[0][0],0,0));
while(!q.empty()){
Node variable=q.front();
q.pop();
if(variable.x==N-1){
if(Max<variable.accumulation&&abs(variable.Left-variable.Right)<=1){
Max=variable.accumulation;
}
}
for(int i=0;i<2;i++){
int bx=variable.x+mv[i][0];
int by=variable.y+mv[i][1];
if(bx>=0&&bx<N&&by>=0&&by<=bx){
if(abs(variable.Left-variable.Right)>N/2) continue;
q.push(Node(bx,by,variable.accumulation+Map[bx][by],variable.Left+(by-variable.y==0?1:0),variable.Right+(by-variable.y==1?1:0)));
}
}
}
cout<<Max<<endl;
return 0;
}
本篇是用搜索解决50%,根据网上本题应用动态规划,以上代码只是基础,希望大家能帮忙优化