列表

详情


NC208246. 胖胖的牛牛

描述

每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2N100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。



输入描述

第一行一个整数:N,下面N 行,每行N 个字符,只出现字符:‘.’,‘x’,‘A’,‘B’;表示上面所说的矩阵格子,每个字符后有一个空格。

输出描述

一个整数:最少转弯次数。如果不能到达,输出-1。

示例1

输入:

3
. x A
. . .
B x .

输出:

2

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 400K, 提交时间: 2020-07-02 10:50:30

#include<bits/stdc++.h>
#define N 105
using namespace std;
int n,m,i,j,k,a,b,f[N][N];
int x,y,xx,yy,q[N*N];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
char s[N][N];
int main()
{
	cin>>n;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			cin>>s[i][j];
			if(s[i][j]=='A')
			{
				q[1]=i*N+j;
				f[i][j]=1;
				s[i][j]='.';
			}
			if(s[i][j]=='B')
			{
				a=i,b=j;
				s[i][j]='.';
			}
		}
	}
	for(i=j=1;i<=j;i++)
	{
		x=q[i]/N,y=q[i]%N;
		for(k=0;k<4;k++)
		{
			xx=x+dx[k],yy=y+dy[k];
			while(s[xx][yy]=='.')
			{
				if(!f[xx][yy])
				{
					f[xx][yy]=f[x][y]+1;
					q[++j]=xx*N+yy;
				}
				xx+=dx[k],yy+=dy[k];
			 } 
		}
	}
	if(f[a][b]) printf("%d\n",f[a][b]-2);
	else printf("-1\n");
	return 0;
 } 

上一题