sicily1703. Obstacle Course

来源:互联网 发布:直播淘宝小二 编辑:程序博客网 时间:2024/06/05 18:25

        一道很典型的最短路径的题目。

        算法的思想来自于Dijkstra(迪杰斯特拉)算法,大家在这里对这个算法就不介绍了。

        可以在学完最短经的算法后,用这道题目当做练手。。我的算法还需要优化一下,代码也需要优化,因为我的代码确实有点乱。。下面的代码仅供参考。。

        题目的链接:http://soj.me/1703

 

#include <iostream>#include <stdio.h>#include <string>#include <cstring>#include <queue>#include <set>#include <vector>using namespace std;int dis[130][130];struct Gra{    int r;    int c;    friend bool operator <(Gra g1, Gra g2)    {        if(dis[g1.r][g1.c] < dis[g2.r][g2.c])            return true;    }};int main(){    int t;    int count = 1;    while (cin >> t && t != 0)    {        int s[130][130];        for (int i = 1; i <= t; ++ i)        {            for (int j = 1; j <= t; ++ j)            {                cin >> s[i][j];            }        }        set<Gra> q;        int know[130][130];        memset(know, 0, sizeof(know));        memset(dis, 9999999, sizeof(dis));        Gra tu[16900];        tu[1].r = 1;        tu[1].c = 1;        q.insert(tu[1]);        Gra temp;        int i = 2;        dis[1][1] = s[1][1];        set<Gra>::iterator it;        set<Gra>::iterator itt;        while (!q.empty())        {            it = q.begin();            temp = *it;            itt = it;            ++ it;            Gra tem;            for (; it != q.end(); ++ it)            {                tem = *it;                if (dis[temp.r][temp.c] > dis[tem.r][tem.c])                {                    temp = tem;                    itt = it;                }            }            q.erase(itt);            know[temp.r][temp.c] = 1;            if (temp.r == t && temp.c == t)            {                cout << "Problem " << count << ": " << dis[temp.r][temp.c] << endl;                break;            }            if (temp.c - 1 >= 1)            {                tu[i].c = temp.c - 1;                tu[i].r = temp.r;                if (know[tu[i].r][tu[i].c] == 0)                {                    if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])                    {                        dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];                        q.insert(tu[i]);                        ++ i;                    }                }            }                        if (temp.r - 1 >= 1)            {                tu[i].r = temp.r - 1;                tu[i].c = temp.c;                if (know[tu[i].r][tu[i].c] == 0)                {                    if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])                    {                        dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];                        q.insert(tu[i]);                        ++ i;                    }                }            }                        if (temp.c + 1 <= t)            {                tu[i].c = temp.c + 1;                tu[i].r = temp.r;                if (know[tu[i].r][tu[i].c] == 0)                {                    if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])                    {                        dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];                        q.insert(tu[i]);                        ++ i;                    }                }            }                        if (temp.r + 1 <= t)            {                tu[i].r = temp.r + 1;                tu[i].c = temp.c;                if (know[tu[i].r][tu[i].c] == 0)                {                    if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])                    {                        dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];                        q.insert(tu[i]);                        ++ i;                    }                }            }                   }        ++ count;    }     //system("pause");}                                 

 

原创粉丝点击