1. 程式人生 > >P1126 機器人搬重物

P1126 機器人搬重物

#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就是卡在這裡。。。)