1. 程式人生 > >Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) B

Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) B

first getchar() eof des problem team sig include style

題鏈

Description

給一張方格圖,對於上下移動無限制,左右移動數分別不能超過L,R,求能到多少點。

Sol

發現 新的y坐標=老坐標-左移操作數+右移操作數

所以我們只需最小化左移操作數即可,最短路。

Code

#include<bits/stdc++.h>
#define N 2007
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
char p[N][N]; pii X;
int dx[4
]={0,1,-1,0},dy[4]={1,0,0,-1}; int in[N][N],ans,cao[N][N],gao; template<class T> inline void read(T &x){ static char c; for (c=getchar();!isdigit(c);c=getchar()); for (x=0;isdigit(c);c=getchar())x=x*10+c-48; } int n,m,l,r,x,y; deque<pii> Q; signed main() { // freopen("2.txt","r",stdin);
read(n); read(m); read(x); read(y); read(l); read(r); memset(cao,0x12,sizeof cao); for (int i=1;i<=n;i++) scanf("%s",p[i]+1); Q.push_back(pii(x,y)); in[x][y]=1; cao[x][y]=0; while (!Q.empty()) { X=Q.front(); Q.pop_front(); in[X.fi][X.se]=0; if (cao[X.fi+dx[0
]][X.se+dy[0]]>cao[X.fi][X.se]+1 &&p[X.fi+dx[0]][X.se+dy[0]]==.) { cao[X.fi+dx[0]][X.se+dy[0]]=cao[X.fi][X.se]+1;//to right if (!in[X.fi+dx[0]][X.se+dy[0]]) { in[X.fi+dx[0]][X.se+dy[0]]=1, Q.push_back(pii(X.fi+dx[0],X.se+dy[0])); } } for (int i=1;i<4;i++) if (cao[X.fi+dx[i]][X.se+dy[i]]>cao[X.fi][X.se] &&p[X.fi+dx[i]][X.se+dy[i]]==.){ cao[X.fi+dx[i]][X.se+dy[i]]=cao[X.fi][X.se];//to right if (!in[X.fi+dx[i]][X.se+dy[i]]) { in[X.fi+dx[i]][X.se+dy[i]]=1, Q.push_back(pii(X.fi+dx[i],X.se+dy[i])); } } } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { // if (p[i][j]==‘*‘) continue; if (cao[i][j]>0x12121211) continue; gao=-(j-y-cao[i][j]); // to left if (gao<=l&&cao[i][j]<=r) ans++; } printf("%d\n",ans); return 0; }

Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) B