L-跑圖-第二屆河北省大學生程序設計競賽
阿新 • • 發佈:2019-05-02
個數 scan 輸出 names dir clu pre int 表示
第一行,有兩個數
n,mn,m
n,m。接下來
nn
n行,每行
mm
m個數。
數據保證至少有一個傳送點。
1≤n≤5001 \leq n \leq 500
1≤n≤500,
1≤m≤5001 \leq m \leq 500
1≤m≤500
輸出:
nn
n行,每行
mm
m個數,表示某個點到離它最近的傳送點的距離。
跑圖是RPG遊戲中很煩躁的事情。玩家需要跑到距離他最近的傳送點的位置。現在給你一張
N×MN \times M
N×M的方格圖,每個方格中數值
00
0表示為平地,數值
11
1表示為傳送點,你的任務是輸出一張
N×MN \times MN×M的矩陣,MatrixxyMatrix_{xy}Matrixxy表示從
(x,y)(x,y)
(x,y)到距離它最近的傳送點的距離。 這裏的距離是曼哈頓距離,
(x1,y1)→(x2,y2)(x_1,y_1) \rightarrow(x_2,y_2)(x1,y1)→(x2,y2) 的距離為∣x1?x2∣+∣y1?y2∣|x_1-x_2|+|y_1-y_2|∣x1?x2∣+∣y1?y2輸入:
n,mn,m
n,m。接下來
nn
n行,每行
mm
m個數。
數據保證至少有一個傳送點。
1≤n≤5001 \leq n \leq 500
1≤n≤500,
1≤m≤5001 \leq m \leq 500
1≤m≤500
輸出:
nn
n行,每行
mm
m個數,表示某個點到離它最近的傳送點的距離。
題意:求出圖中每一個點到最近的(曼哈頓距離)的傳送點的距離.
題解:先保存所有的傳送點,枚舉每一個傳送點搜索,如果某個點到某個傳送點的距離小於原來保存的距離,那麽我們就更新這個點.全部結束後,保存的就是最優解.
#include <bits/stdc++.h> using namespace std; const int N=505; //int mp[N][N]; int vis[N][N]; #define P pair<int,int> queue<P> q; int dir[4][2]={1,0,0,1,-1,0,0,-1}; void bfs(P now){ queue<P> qp; qp.push(now); while(!qp.empty()){ now=qp.front();qp.pop(); for(int i=0;i<4;i++){ int x=now.first+dir[i][0],y=now.second+dir[i][1]; if(vis[x][y]>vis[now.first][now.second]+1) vis[x][y]=vis[now.first][now.second]+1,qp.push({x,y}); // } } } int main(){ int n,m; cin>>n>>m; int p; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&p); if(p==1) q.push({i,j}),vis[i][j]=0; else vis[i][j]=0x3f3f3f; } } P node; while(!q.empty()){ node=q.front();q.pop(); bfs(node); } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%d%c",vis[i][j],j==m?'\n':' '); } } return 0; }
L-跑圖-第二屆河北省大學生程序設計競賽