• 【t032】地理


    Time Limit: 1 second
    Memory Limit: 64 MB

    【问题描述】

    奶牛们刚学习完地理课,知道地球是个球。他们非常震惊,满脑子都是球形。他们试图把地球表面看成一个NxN (1 <= N <= 100)的方格,但是顶端连接着底部、左边连接到右边。格子用坐标表示,左下角坐标为(1,1)。
    例如: N=5时,牛从(1,3)位置向下走会到(5,3);从(2,5)向右走会到(2,1)位置。牛可以上、下、左、右和斜线方向走。
    如果按照牛的模型,请计算依次行走 M(1 <= M <= 100) 格子的最短路径。

    【输入格式】

    第一行:两个整数: N M。
    下面M行:表示依次要行走的格子坐标:r c。
    【说明】:先花一步从(1,1)走到(5,5),再花两步从(5,5)走到(3,5)。

    【输出格式】

    最少行走步数。

    Sample Input

    5 3
    1 1
    5 5
    3 5

    Sample Output

    3

    【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t032

    【题解】

    相当于m个起点,m个终点的最短路问题;
    因为权值为1;所以第一次到达的点肯定是最近的;用个bfs写一下广搜就好;坐标大于n变为1,小于1变为n;
    八个方向广搜;
    复杂度O(M*N*N)

    【完整代码】

    #include <cstdio>
    #include <queue>
    using namespace std;
    #define pii pair<int,int>
    #define mp make_pair
    #define fi first
    #define se second
    
    const int MAXN = 100+10;
    const int dx[9] = {0,0,0,1,-1,1,1,-1,-1};
    const int dy[9] = {0,1,-1,0,0,-1,1,-1,1};
    
    int n,m,s,t,ans = 0;
    int dis[MAXN][MAXN];
    queue <pii> dl;
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        scanf("%d%d",&n,&m);
        scanf("%d%d",&s,&t);
        for (int ii = 2;ii <= m;ii++)
        {
            for (int i= 1;i <= 100;i++)
                for (int j = 1;j <= 100;j++)
                    dis[i][j] = 7e8;
            int x,y;
            scanf("%d%d",&x,&y);
            dis[s][t] = 0;
            dl.push(mp(s,t));
            while (!dl.empty())
            {
                int tx = dl.front().fi,ty = dl.front().se;
                dl.pop();
                for (int i = 1;i <= 8;i++)
                {
                    int tx1 = tx+dx[i],ty1 = ty+dy[i];
                    if (tx1 > n ) tx1 = 1;if (tx1 < 1 ) tx1 = n;
                    if (ty1 > n ) ty1 = 1;if (ty1 < 1 ) ty1 = n;
                    if (dis[tx1][ty1]>dis[tx][ty]+1)
                    {
                        dis[tx1][ty1]=dis[tx][ty]+1;
                        dl.push(mp(tx1,ty1));
                    }
                }
            }
            ans += dis[x][y];
            s = x,t = y;
        }
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    boost::asio::error的用法浅析
    boost::asio::buffer
    sqlserver2008安装图解
    WCF 聊天室程序代码详细讲解教程
    C#中使用Property Grid(属性面板)控件
    TXT>Access 使用DAO数据源!(VB Code)
    读取INI文件 VbCode
    Pet Shop 4
    模式行为型
    C#编程规范
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626677.html
Copyright © 2020-2023  润新知