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;
}