【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;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626677.html