`
linxiaoty
  • 浏览: 12758 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

sicily1321. Robot

阅读更多

1321. Robot

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

Karell Incorporated has designed a new exploration robot that has the ability to explore new terrains, this new robot can move in all kinds of terrain, it only needs more fuel to move in rough terrains, and less fuel in plain terrains. The only problem this robot has is that it can only move orthogonally, the robot can only move to the grids that are at the North, East, South or West of its position.

The Karell`s robot can communicate to a satellite dish to have a picture of the terrain that is going to explore, so it can select the best route to the ending point, The robot always choose the path that needs the minimum fuel to complete its exploration, however the scientist that are experimenting with the robot, need a program that computes the path that would need the minimum amount of fuel. The maximum amount of fuel that the robot can handle is 9999 units

The Terrain that the robot receives from the satellite is divided into a grid, where each cell of the grid is assigned to the amount of fuel the robot would need to pass thought that cell. The robot also receives the starting and ending coordinates of the exploration area.

<!-- MATH $\epsfbox{p3481.eps}$ -->\epsfbox{p3481.eps} <TEX2HTML_VERBATIM_MARK>
Path Example
From (1,1) to (5,5)
Fuel needed 10

 

Input

The first line of the input file is the number of tests that must be examined.

The first line of the test is the number of rows and columns that the grid will contain. The rows and columns will be <!-- MATH $0 < row \le 100$ -->0 < row$ \le$100 <TEX2HTML_VERBATIM_MARK>, <!-- MATH $0 < column \le 100$ -->0 < column$ \le$100 <TEX2HTML_VERBATIM_MARK>

The next lines are the data of the terrain grid

The last line of the test has the starting and ending coordinates.

 

Output

One line, for each test will have the amount of fuel needed by the robot

 

Sample Input

3
5 5
1 1 5 3 2
4 1 4 2 6
3 1 1 3 3 
5 2 3 1 2
2 1 1 1 1
1 1 5 5 
5 4
2 2 15 1
5 1 15 1
5 3 10 1
5 2 1 1 
8 13 2 15
1 1 1 4 
10 10
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 10 10

 

Sample Output

10

         这又是一道典型的寻找最短路径的题目。题目没有很大的难度,注意一下算法的实现就行了。

 

这题目图的存储在矩阵中,一次遍历,寻找就可以找到最短路径。

                   题目链接: http://soj.me/1321

                  参考代码:

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
using namespace std;

int dis[109][109];

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;
    cin >> t;
    while (t --)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        int s[109][109];
        for (int i = 1; i <= a; ++ i)
        {
            for (int j = 1; j <= b; ++ j)
            {
                cin >> s[i][j];
            }
        }
        int ar, ac, br, bc;
        cin >> ar >> ac >> br >> bc;
        set<Gra> q;
        int know[109][109];
        memset(know, 0, sizeof(know));
        memset(dis, 9999999, sizeof(dis));
        Gra tu[10009];
        tu[1].r = ar;
        tu[1].c = ac;
        q.insert(tu[1]);
        Gra temp;
        int i = 2;
        //know[ar][ac] = 1;
        dis[ar][ac] = s[ar][ac];
        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 == br && temp.c == bc)
            {
                cout << 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 <= b)
            {
                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 <= a)
            {
                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;
                    }
                }
            }
        }
    }
     //system("pause");
}                                 

 

分享到:
评论

相关推荐

    sicily1294.rar_1294_sicily

    【标题】"sicily1294.rar_1294_sicily" 提供的信息表明,这可能是一个与中山大学ACM竞赛相关的代码压缩包,其中包含了对问题1294 "Sicily"的解决方案。在ACM(国际大学生程序设计竞赛,International Collegiate ...

    sicily 1562.LVM

    sicily 1562_LVM.cpp参考代码

    CPP-for-sicily.zip_sicily

    "CPP-for-sicily.zip_sicily"这个压缩包,显然是为了解决与"Sicily"相关的编程问题而准备的资源,它包含了一份名为"C++ for sicily.doc"的文档,这很可能是针对Sicily地区或某个特定的Sicily项目的一份C++解题模板...

    Sicily_Queue.rar_sicily

    "Sicily_Queue.rar_sicily"这个压缩包文件显然包含了与在Sicily平台上实现高效队列操作相关的代码或文档。 首先,我们需要理解队列的基本概念。队列就像一个等待服务的队伍,新进来的元素(入队)会排在队伍的末尾...

    sicily-1274.rar_sicily

    【标题】"sicily-1274.rar_sicily" 指向的是一个名为 "sicily-1274" 的RAR压缩文件,它包含的可能是一个关于 "sicily" 项目的源代码。RAR是一种流行的压缩格式,用于打包多个文件或文件夹到一个单一的、易于管理的...

    sicily_source.zip_sicily

    在“sicily_source.zip_sicily”这个压缩包文件中,我们主要关注的是与西西里相关的编程练习,这些练习涵盖了输入输出操作和标准程序设计,同时也涉及到超高精度浮点数的输出问题以及关联数组这一数据结构。...

    sicily-code.rar_1137_sicily

    sicily-code.rar_1137_sicily 是一个压缩包文件,包含了中山大学某个项目或课程相关的代码。从描述中我们可以推断,这个项目或课程可能与 sicily 相关,而数字序列1137可能是课程编号、版本号或者是项目的特定标识。...

    sicily-online-judge.zip_sicily

    - "robot.cpp" 文件的名称没有明确指明具体主题,但考虑到 sicily online judge 的背景,这可能是一个关于机器人路径规划或运动控制的编程问题,可能涉及到搜索算法(如深度优先搜索或广度优先搜索)或图论中的移动...

    sicily-code--2.rar_sicily

    【 sicily-code--2.rar_sicily 知识点详解】 这个压缩包“sicily-code--2.rar_sicily”包含的是中山大学 sicily 项目的一系列参考代码,旨在帮助学习者理解和掌握 sicily 项目的具体实现。在这个压缩包中,我们可以...

    sicily-code--3.rar_sicily

    【标题】"sicily-code--3.rar_sicily" 提供的是中山大学sicily课程相关的编程参考资料,这可能是一门涵盖计算机科学与信息技术的课程,其中涉及到的代码可能是用于教学或者项目实践。从描述来看,这个压缩包包含了...

    sicily-code--5.rar_sicily

    【标题】"sicily-code--5.rar_sicily" 暗示了这是一个与 sicily 相关的代码项目,可能包含的是一个软件或游戏的源代码,版本号可能是5。"rar" 是一种常见的文件压缩格式,意味着这些代码被打包在RAR文件里。 【描述...

    soj.rar_1876_sicily 1022_sicily 1934_sicily soj IP

    标题中的"soj.rar_1876_sicily 1022_sicily 1934_sicily soj IP" 提到了几个关键元素,这些元素指向了一个编程竞赛或者作业集中的多个问题。"soj"通常代表"Software Judge",这是一个用于在线编程竞赛或教育平台的...

    sicily部分题目源代码

    【 sicily 部分题目源代码 】 涉及到的是 sicily 平台上的算法题目解法,这些源代码已经过测试,确保能够正确运行并得出预期结果。在算法领域,编写源代码是解决问题的关键步骤,尤其是在 sicily 这样的在线编程平台...

    sicily上部分题目代码

    通过对 sicily.doc 文件的深入研究,我们可以学习到实际编程中如何将理论知识应用于解决实际问题,同时也能提高我们的编程技巧和问题解决能力。无论是对初学者还是经验丰富的开发者,这样的资源都是宝贵的学习材料。

    sicily AC代码

    sicily AC代码指的是在编程竞赛或算法挑战中,参赛者提交并通过了评测系统的源代码集合。这个"112页的大礼包"很可能是一份综合性的编程资源,包含了多个不同的问题解决方案,涵盖了各种算法和数据结构的应用。从标签...

    中大sicily编程平台上机考试资料整理

    文件中还提到了“sicily1211.商人的宣传”,这可能是指与图论相关的一个编程题目,需要利用矩阵的幂运算来解决问题。这部分内容在文件中没有详细展开,但基于标题,我们可以知道这是一个关于编程平台上机考试的资料...

    sicily刷题指南

    中大sicily online judge的刷题指南,里面介绍得很详细,不过,最近sicily好像不能外网访问了。

    sicily1006代码

    本cpp是sicily的1006的解题代码 这份代码以最简单的方式实现了它的功能要求 值得学习一番

    sicily-code--4.rar_17_951_815

    sicily-code--4.rar_17_951_815 是一个压缩包文件,其内容可能包含中山大学 sicily 项目相关的源代码。这个项目可能是为了研究或教学目的,涉及的时间范围从1350年到1815年,这可能暗示着它与历史、模拟或者数据分析...

Global site tag (gtag.js) - Google Analytics