1 条题解
-
0
自动搬运
来自洛谷,原作者为

Alanalan
**搬运于
2025-08-24 21:35:04,当前版本为作者最后更新于2018-07-08 14:57:28,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
#include<bits/stdc++.h> using namespace std; #define N 16385 const int INF=0x3f3f3f3f; const int dx[]={0,0,1,-1}; const int dy[]={1,-1,0,0}; const int ddx[]={0,0,1,1,1,-1,-1,-1}; const int ddy[]={1,-1,-1,0,1,-1,0,1}; string s[N];//n*m<=16000 vector<int> dis[N]; struct node { int x,y; }; int n,m; queue<node> q; bool ok(int x,int y) { return x>=0 && x<n && y>=0 && y<m && s[x][y]=='O'; } void bfs(int sx,int sy) { for(int i=0;i<n;++i) for(int j=0;j<m;++j) dis[i][j]=INF; q.push(node{sx,sy}); dis[sx][sy]=0; while(!q.empty()) { int x=q.front().x; int y=q.front().y; q.pop(); for(int i=0;i<4;++i)//四个方向 { int xx=x+dx[i]; int yy=y+dy[i]; if(ok(xx,yy) && dis[xx][yy]==INF) { dis[xx][yy]=dis[x][y]+1; q.push(node{xx,yy}); } } } } int main() { cin>>n>>m; for(int i=0;i<n;++i) { cin>>s[i]; dis[i].resize(m+1);//规定每个vector长度 } int sx,sy,ex,ey; while(cin>>ex>>ey>>sx>>sy) { if(!ex&&!ey&&!sx&&!sy) break; --ex;--ey;--sx;--sy; bfs(sx,sy); int ans=dis[ex][ey]; for(int i=0;i<8;++i) { int x=ex,y=ey; while(ok(x+ddx[i],y+ddy[i])) { x+=ddx[i]; y+=ddy[i]; ans=min(ans,dis[x][y]); } } if(ans==INF) puts("Poor Harry"); else printf("%d\n",ans); } return 0; }
- 1
信息
- ID
- 1194
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者