2 条题解
-
0
#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
- 1
信息
- ID
- 301
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者