列表

详情


NC212331. ObstacleCourse障碍训练课

描述

考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了’x’。例如下图:

. . B x .
. x x A .
. . . x .
. x . . .
. . x . .

 

贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。

输入描述

第 1行: 一个整数 N 行

2..N + 1: 行 i+1 有 N 个字符 (‘.’, ‘x’, ‘A’, ‘B’),表示每个点的状态。

输出描述

行 1: 一个整数,最少的转弯次数。

示例1

输入:

3
.xA
…
Bx.

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 468K, 提交时间: 2022-09-05 15:20:38

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;

const int N=110;

char mp[N][N];
int n,m,sx,sy,ex,ey;
bool st[N][N];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
struct Node
{
	int x,y;
	int cnt;
};

int bfs()
{
	queue<Node> q;
	q.push({sx,sy,-1});
	
	while(q.size())
	{
		Node t=q.front();
		q.pop();
		int x=t.x,y=t.y;
		
		for(int i=0;i<4;i++)
			for(int j=1;;j++)
			{
				int xx=x+dx[i]*j,yy=y+dy[i]*j;
				if(xx<0||xx>n-1||yy<0||yy>n-1||mp[xx][yy]=='x')
					break;
				if(st[xx][yy])
					continue;
				if(xx==ex&&yy==ey)
					return t.cnt+1;
				if(!st[xx][yy])
				{
					st[xx][yy]=1;
					q.push({xx,yy,t.cnt+1});
				}
				
			}
	}
	return 0;
}

int main()
{
	cin>>n;
	getchar();
	for(int i=0;i<n;i++)
	{
		scanf("%s",mp[i]);
		for(int j=0;j<n;j++)
		{
			if(mp[i][j]=='A')
				sx=i,sy=j;
			if(mp[i][j]=='B')
				ex=i,ey=j;
		}
	}
	cout<<bfs()<<endl;
}

上一题