P1126 機器人搬重物
阿新 • • 發佈:2018-12-11
#include<bits/stdc++.h> using namespace std; const int INF=1000000000; int a[55][55]={}; int sx,sy,ex,ey; int n,m; int mincnt=INF; int vis[100][100]; map<char,int> mp; struct Node{ int xx,yy,dir,step; }; void bfs(Node st){ queue<Node> q; q.push(st); while(!q.empty()){ Node now=q.front(); if(now.xx==ex&&now.yy==ey&&(mincnt>now.step)) mincnt=now.step; q.pop(); for(int i=1;i<=4;i++){//列舉,把可以走的方向push進去 int stp=now.step; if(i!=now.dir){ if((i==1&&(now.dir==4||now.dir==2))||(i==2&&(now.dir==1||now.dir==3))||(i==3&&(now.dir==4||now.dir==2))||(i==4&&(now.dir==3||now.dir==1))){ stp=now.step+1; }else if((i==1&&now.dir==3)||(i==2&&now.dir==4)||(i==3&&now.dir==1)||(i==4&&now.dir==2)){ stp=now.step+2; } } for(int j=1;j<=3;j++){ Node temp; if(i==1) temp.xx=now.xx,temp.yy=now.yy+j; if(i==2) temp.xx=now.xx+j,temp.yy=now.yy; if(i==3) temp.xx=now.xx,temp.yy=now.yy-j; if(i==4) temp.xx=now.xx-j,temp.yy=now.yy; if(temp.xx<1||temp.xx>=n||temp.yy>=m||temp.yy<1||a[temp.xx][temp.yy]==1) break; if(vis[temp.xx][temp.yy]>stp){ temp.step=stp+1; temp.dir=i; q.push(temp); vis[temp.xx][temp.yy]=stp; } } } } } int main() { freopen("in.txt","r",stdin); cin>>n>>m; mp['E']=1;mp['S']=2;mp['W']=3;mp['N']=4; fill(vis[0],vis[0]+100*100,INF); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int temp; cin>>temp; if(temp>0) a[i][j]=a[i-1][j-1]=a[i-1][j]=a[i][j-1]=temp; } } for(int i=0;i<=n;i++){ a[i][0]=1; a[i][m]=1; } for(int i=0;i<=m;i++){ a[0][i]=1; a[n][i]=1; } char d; scanf("%d %d %d %d %c",&sx,&sy,&ex,&ey,&d); Node t;int dd=mp[d]; t.dir=dd;t.step=0;t.xx=sx;t.yy=sy; bfs(t); if(mincnt>=INF) cout<<-1; else cout<<mincnt; return 0; }
注意往東縱座標加,往西減,往南加,往北減(LZ就是卡在這裡。。。)