最短路径BFS算法matlab,最短路径有关问题(BFS)

最短路径问题(BFS)

#include

#include

#include

#include

using namespace std;

const int maxn = 1000;

struct locat{

int x;

int y;

int sum; ///存放当前到达此处最小值

int pre; ///原始值,不变的。

bool mark;///标记此处已经访问过,即sum的值已经改变。

locat(){

mark = false;

}

};

locat map1[maxn][maxn];

int m, n;

int ex, ey;///目的地点。

void init(){

scanf("%d%d", &m, &n);

for(int i = 1; i <= n; i++) {

for(int j = 1; j <= m; j++) {

scanf("%d", &map1[i][j].pre);

map1[i][j].sum = map1[i][j].pre; ///初始化

map1[i][j].x = i;

map1[i][j].y = j;

}

}

scanf("%d%d", &ex, &ey);

}

void work() {

locat tmp;

locat tmp1;

queue q;

q.push(map1[1][1]);

while(q.empty()!=true) {

tmp = q.front();

tmp1 = tmp; ///保存tmp的值,在向右走的时候用。

q.pop();

if(tmp.x

if(map1[tmp.x+1][tmp.y].mark == false) { ///第一次访问

tmp.sum = tmp.sum + map1[tmp.x+1][tmp.y].pre;

map1[tmp.x+1][tmp.y].sum = tmp.sum;

q.push(tmp);

map1[tmp.x+1][tmp.y].mark = true;

}

else{///第二次访问

map1[tmp.x+1][tmp.y].sum = min(map1[tmp.x+1][tmp.y].sum, map1[tmp.x][tmp.y].sum + map1[tmp.x+1][tmp.y].pre);

/* if(tmp.x+1 == ex && tmp.y == ey) {

break;

}

*/

q.push(map1[tmp.x+1][tmp.y]);

}

}

if(tmp1.y

if(map1[tmp1.x][tmp1.y+1].mark == false) {

tmp1.sum = tmp1.sum + map1[tmp1.x][tmp1.y+1].pre;

map1[tmp1.x][tmp1.y+1].sum = tmp1.sum;

q.push(tmp1);

map1[tmp1.x][tmp1.y+1].mark = true;

}

else{

map1[tmp1.x][tmp1.y+1].sum = min(map1[tmp1.x][tmp1.y+1].sum, map1[tmp1.x][tmp1.y].sum+map1[tmp1.x][tmp.y+1].pre);

/* if(tmp1.x == ex && tmp1.y+1 == ey) {

break;

}

*/

q.push(map1[tmp1.x][tmp1.y+1]);

}

}

}

}

int main()

{

init();

work();

printf("%d\n", map1[ex][ey].sum);

return 0;

}

/********************************

题目:从(1,1)到(m,n)的最短路径。

测试数据:

输入:

4 4

1 2 3 4

5 1 2 5

2 1 8 9

1 1 1 1

4 4

输出:

8

********************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值