sicily1703. Obstacle Course

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

        算法的思想来自于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");
}                                 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值