最短路径问题(BFS)

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
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<locat> q;
    q.push(map1[1][1]);
    while(q.empty()!=true) {
        tmp = q.front();
        tmp1 = tmp; ///保存tmp的值,在向右走的时候用。
        q.pop();
        if(tmp.x<m){ ///判断是否越界,否则向下走。
            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<n) {
            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
********************************/

你可能感兴趣的:(最短路径问题(BFS))