您的位置:首页 > 其它

[Codeforces] Round #354 (Div. 2)(E题艹不出)

2016-05-30 16:42 316 查看
A题题意:给定一个1到n的排列,可以交换其中某一对数,求1与n的距离最大值

#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define mp make_pair
#define maxn 1005
char s[maxn];
int n,m,poi[maxn][maxn][4][4],vis[maxn][maxn][4];
typedef pair<pair<int,int>,int>pii;
queue<pii>Q;
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
void bfs(){
int sx,sy,tx,ty;
scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
vis[sx][sy][0]=1;
Q.push(mp(mp(sx,sy),0));
int ans=0;
while(!Q.empty()){
pii tmp=Q.front(); Q.pop();
int x=tmp.fir.fir,y=tmp.fir.sec,d=tmp.sec;
if(x==tx&&y==ty){
ans=vis[tx][ty][d];
break;
}
if(!vis[x][y][(d+1)%4]){
vis[x][y][(d+1)%4]=vis[x][y][d]+1;
Q.push(mp(mp(x,y),(d+1)%4));
}
for(int i=0;i<4;i++){
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx<1||xx>n||yy<1||yy>m)continue;
if(vis[xx][yy][d])continue;
if(poi[x][y][d][i]&&poi[xx][yy][d][(i+2)%4]){
vis[xx][yy][d]=vis[x][y][d]+1;
Q.push(mp(mp(xx,yy),d));
}
}
}
printf("%d\n",ans-1);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++){
if(s[j]=='+')poi[i][j][0][0]=poi[i][j][0][1]=poi[i][j][0][2]=poi[i][j][0][3]=1;
if(s[j]=='-')poi[i][j][0][0]=poi[i][j][0][2]=1;
if(s[j]=='|')poi[i][j][0][1]=poi[i][j][0][3]=1;
if(s[j]=='^')poi[i][j][0][1]=1;
if(s[j]=='>')poi[i][j][0][2]=1;
if(s[j]=='<')poi[i][j][0][0]=1;
if(s[j]=='v')poi[i][j][0][3]=1;
if(s[j]=='L')poi[i][j][0][1]=poi[i][j][0][2]=poi[i][j][0][3]=1;
if(s[j]=='R')poi[i][j][0][0]=poi[i][j][0][1]=poi[i][j][0][3]=1;
if(s[j]=='U')poi[i][j][0][0]=poi[i][j][0][2]=poi[i][j][0][3]=1;
if(s[j]=='D')poi[i][j][0][0]=poi[i][j][0][1]=poi[i][j][0][2]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<4;k++)
for(int l=0;l<4;l++)
poi[i][j][k][(l+k)%4]=poi[i][j][0][l];
bfs();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: