2 条题解

  • 0
    @ 2022-6-19 21:45:27
    #include<bits/stdc++.h>
    using namespace std;
    int a,b,xx,yy,x,y;
    int dx[4]= {-1,0,1,0},dy[4]= {0,1,0,-1};//方向数组,很方便 
    int m[1001][1001][4];//数组维护花费 
    bool s[1001][1001];
    char ch;
    struct P {//协助优先队列 
    	int x,y,to;
    	bool operator<(const P& t)const {//优先规则 
    		return m[t.x][t.y][t.to]<m[x][y][to];
    	}
    } k,l;
    priority_queue<P> st;
    int main() {
    	memset(m,0x7f,sizeof m);//初始化 
    	cin>>a>>b;
    	for(int i=1; i<=a; i++)//读入 
    		for(int j=1; j<=b; j++) {
    			cin>>ch;
    			if(ch!='.') {
    				s[i][j]=1;
    				if(ch!='#') {
    					if(ch!='F') {
    						if(ch=='N')
    							k.to=0;
    						if(ch=='S')
    							k.to=2;
    						if(ch=='W')
    							k.to=3;
    						if(ch=='E')
    							k.to=1;
    						k.x=i;
    						k.y=j;
    					} else {
    						xx=i;
    						yy=j;
    					}
    				}
    			}
    		}
    	m[k.x][k.y][k.to]=0;
    	st.push(k);
    	while(!st.empty()) {//BFS开始 
    		bool q=0;
    		k=st.top();
    		if(k.x==xx&&k.y==yy)//访问到终点 
    		break;
    		st.pop();
    		x=k.x+dx[k.to];
    		y=k.y+dy[k.to];
    		if(s[x][y])
    			q=1;
    		if(s[x][y]&&m[x][y][k.to]>m[k.x][k.y][k.to]) {//前进判断 
    			m[x][y][k.to]=m[k.x][k.y][k.to];
    			l.x=x;
    			l.y=y;
    			l.to=k.to;
    			st.push(l);
    		}
    		x=k.x+dx[(k.to+3)%4];
    		y=k.y+dy[(k.to+3)%4];
    		if(s[x][y])
    			q=1;
    		if(s[x][y]&&m[x][y][(k.to+3)%4]>m[k.x][k.y][k.to]+1) {//左转判断 
    			m[x][y][(k.to+3)%4]=m[k.x][k.y][k.to]+1;
    			l.x=x;
    			l.y=y;
    			l.to=(k.to+3)%4;
    			st.push(l);
    		}
    		x=k.x+dx[(k.to+1)%4];
    		y=k.y+dy[(k.to+1)%4];
    		if(s[x][y])
    			q=1;
    		if(s[x][y]&&m[x][y][(k.to+1)%4]>m[k.x][k.y][k.to]+5) {//右转判断 
    			m[x][y][(k.to+1)%4]=m[k.x][k.y][k.to]+5;
    			l.x=x;
    			l.y=y;
    			l.to=(k.to+1)%4;
    			st.push(l);
    		}
    		if(!q) {//判断其他操作能不能做 
    			x=k.x+dx[(k.to+2)%4];
    			y=k.y+dy[(k.to+2)%4];
    			if(s[x][y]&&m[x][y][(k.to+2)%4]>m[k.x][k.y][k.to]+10) {//后退判断 
    				m[x][y][(k.to+2)%4]=m[k.x][k.y][k.to]+10;
    				l.x=x;
    				l.y=y;
    				l.to=(k.to+2)%4;
    				st.push(l);
    			}
    		}
    	}
    	cout<<m[k.x][k.y][k.to];
    	return 0;
    }//97行代码QAQ
    
    • 0
      @ 2022-6-19 21:45:19
      
      
      • 1

      信息

      ID
      301
      时间
      1000ms
      内存
      125MiB
      难度
      4
      标签
      递交数
      2
      已通过
      1
      上传者