开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的BFS即可,但是由于队列没有重判,一直爆队列(MLE!)下次一定要注意!
(bfs第一次到达便最优?)
#include<queue> #include<iostream> #include<string> #include<cstring> using namespace std; int a[52][52]; bool mark[52][52][5]; //三个状态的重判 struct xy { int x,y; int chaoxiang; int count; }; int minconmand; int n,m; void bfs(xy from,xy last) //如果不判重!必然爆队列! { queue<xy>q; q.push(from); mark[from.x][from.y][from.chaoxiang]=1; while(!q.empty()) { xy cur=q.front(); q.pop(); if(cur.x==last.x&&cur.y==last.y) { if(cur.count<minconmand)minconmand=cur.count; // cout<<minconmand<<endl; return ; } else { xy next(cur); next.count++; if(next.count>=minconmand)continue; next.chaoxiang=((next.chaoxiang+1==5)?1:(next.chaoxiang+1)); if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; next=cur; next.count++; next.chaoxiang=((cur.chaoxiang-1==0)?4:(cur.chaoxiang-1)); if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; next=cur; next.count++; if(next.chaoxiang==1) { for(int i=1;i<=3;i++) { next.x-=1; if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue; if(a[next.x-1][next.y]==1||a[next.x-1][next.y-1]==1)break; if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; } } else if(next.chaoxiang==2) { for(int i=1;i<=3;i++) { next.y-=1; if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue; if(a[next.x][next.y-1]==1||a[next.x-1][next.y-1]==1)break; if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; } } else if(next.chaoxiang==3) { for(int i=1;i<=3;i++) { next.x+=1; if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue; if(a[next.x][next.y]==1||a[next.x][next.y-1]==1)break; if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; } } else if(next.chaoxiang==4) { for(int i=1;i<=3;i++) { next.y+=1; if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue; if(a[next.x][next.y]==1||a[next.x-1][next.y]==1)break; if(mark[next.x][next.y][next.chaoxiang]==0) q.push(next); mark[next.x][next.y][next.chaoxiang]=1; } } } } return; } int main() { while(cin>>m>>n&&(n||m)) { for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>a[i][j]; memset(mark,0,sizeof(mark)); xy from,last; string chaoxiang; cin>>from.x>>from.y; cin>>last.x>>last.y; cin>>chaoxiang; from.count=0; if(chaoxiang=="south")from.chaoxiang=3; else if(chaoxiang=="north")from.chaoxiang=1; else if(chaoxiang=="west")from.chaoxiang=2; else if(chaoxiang=="east")from.chaoxiang=4; minconmand=1000000; bfs(from,last); if(minconmand==1000000)cout<<-1<<endl; else cout<<minconmand<<endl; } }