列表

详情


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;
}

上一题