NC23864. Chino with Ciste
描述
Chino的数学很差,因此Cocoa非常担心。但是今天Cocoa不准备教Chino什么啦(欢呼!)!
事情是这样的,Cocoa在打扫爷爷的咖啡屋卫生的时候偶然从相框里掉出来一张地图——小镇的传统寻宝游戏Ciste.
游戏的规则也很简单,首先有一个起点,然后是下一个藏有地图的位置。如此下去,最终找到藏宝地点。
Cocoa还没有玩过这个游戏呢,因此她非常期待……寻宝的过程非常快乐,Cocoa也找到了宝物,“宝物就是你决定性的瞬间!”。不过,现在,拿着所有地图的Cocoa看着小镇的地图,给Chino布置了一个作业,以检查自己教学的效果:
假设小镇的地图是一个的网格,其中有一些格子是空地,用’.’表示,可以朝上下左右四个方向中的若干个方向走;另外一些格子是房屋,用’*’表示,不能通过。现在Cocoa在’S’,宝物在’T’,请问Cocoa应该如何选择路线,才能使自己转最少的弯呢?
题目对Chino来说太难啦,你能帮一帮Chino吗?
输入描述
第一行是两个正整数n, m;接下来是一个的矩阵,表示小镇的地图
输出描述
最少的拐弯次数。如果不能到达,请输出"troil"(不带引号).
示例1
输入:
4 4 S..* .*.* .... .*.T
输出:
2
C++14(g++5.4) 解法, 执行用时: 415ms, 内存消耗: 24060K, 提交时间: 2020-01-10 15:42:52
#pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; const int N=2e3+10; const int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int n,m,sx,sy,ex,ey,vis[N][N]; char g[N][N]; void bfs(){ queue<pair<int,int> > q; q.push({sx,sy}); memset(vis,-1,sizeof vis); vis[sx][sy]=0; while(q.size()){ int x=q.front().first,y=q.front().second; q.pop(); for(int i=0;i<4;i++){ int tx=x+dx[i],ty=y+dy[i]; while(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]!='*'){ if(vis[tx][ty]==-1) vis[tx][ty]=vis[x][y]+1,q.push({tx,ty}); if(tx==ex&&ty==ey) return ; tx+=dx[i],ty+=dy[i]; } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++) scanf("%s",g[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(g[i][j]=='S') sx=i,sy=j; if(g[i][j]=='T') ex=i,ey=j; } bfs(); if(vis[ex][ey]==-1) puts("troil"); else cout<<vis[ex][ey]-1; return 0; }
C++ 解法, 执行用时: 307ms, 内存消耗: 20160K, 提交时间: 2021-07-15 11:30:41
#include<bits/stdc++.h> using namespace std; const int N=2e3+10; const int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int n,m,sx,sy,ex,ey,vis[N][N]; char g[N][N]; void bfs(){ queue<pair<int,int> > q; q.push({sx,sy}); memset(vis,-1,sizeof vis); vis[sx][sy]=0; while(q.size()){ int x=q.front().first,y=q.front().second; q.pop(); for(int i=0;i<4;i++){ int tx=x+dx[i],ty=y+dy[i]; while(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]!='*'){ if(vis[tx][ty]==-1) vis[tx][ty]=vis[x][y]+1,q.push({tx,ty}); if(tx==ex&&ty==ey) return ; tx+=dx[i],ty+=dy[i]; } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++) scanf("%s",g[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(g[i][j]=='S') sx=i,sy=j; if(g[i][j]=='T') ex=i,ey=j; } bfs(); if(vis[ex][ey]==-1) puts("troil"); else cout<<vis[ex][ey]-1; return 0; }