1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=510; char g[N][N]; int dist[N][N],st[N][N]; #define x first #define y second typedef pair<int,int> PII; int n,m; int bfs() { memset(dist,0x3f,sizeof dist); memset(st,0,sizeof st); deque<PII> q; q.push_back({0,0}); dist[0][0]=0; int dx[]={-1,-1,1,1},dy[]={-1,1,-1,1}; //格点的坐标变化 int ix[]={-1,-1,0,0},iy[]={-1,0,-1,0}; //电子元件的坐标 char cs[]="\\//\\"; //对应方向的合法电子元件方向 while(q.size()) { PII t=q.front(); q.pop_front(); if(st[t.x][t.y]) continue; //冗余备份 st[t.x][t.y]=1; //标记已经获得最短路 for(int i=0;i<4;i++) { int a=t.x+dx[i],b=t.y+dy[i]; //计算下一个格点坐标 int ga=t.x+ix[i],gb=t.y+iy[i]; //计算电子元件坐标 int w=cs[i]==g[ga][gb]?0:1; //判断权重 if(a<0||a>n||b<0||b>m) continue; //越界 if(dist[a][b]<=dist[t.x][t.y]) continue; //距离更差 dist[a][b]=dist[t.x][t.y]+w; //更新距离 if(w) q.push_back({a,b}); //后面入队 else q.push_front({a,b}); //前面入队 } } return dist[n][m]; } int main() { int t; cin>>t; while(t--) { cin>>n>>m; for(int i=0;i<n;i++) cin>>g[i]; int t=bfs(); if(t==0x3f3f3f3f) cout<<"NO SOLUTION"<<endl; else cout<<t<<endl; } return 0; }
- 1
信息
- ID
- 781
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者