链接:https://ac.nowcoder.com/acm/problem/208246
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2≤N≤100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。
输入描述:
第一行一个整数:N,下面N 行,每行N 个字符,只出现字符:‘.’,‘x’,‘A’,‘B’;表示上面所说的矩阵格子,每个字符后有一个空格。
输出描述:
一个整数:最少转弯次数。如果不能到达,输出-1。
示例1
输入
复制
3
. x A
. . .
B x .
输出
复制
2
备注:
开始和结束时的方向任意。
#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>
#include<cstdio>
using namespace std;
char mp[110][110];
int vis[110][110];
int res=0x3f3f3f3f;
int sx,sy,zx,zy;
int dx[]={
1,-1,0,0};
int dy[]={
0,0,-1,1};
int n;
void dfs(int x,int y,int sum,int st){
if(mp[x][y]=='B'){
res=min(res,sum);
return ;
}
if(sum>=res)return ;
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&!vis[xx][yy]&&mp[xx][yy]!='x'){
if(st==-1){
vis[xx][yy]=1;
dfs(xx,yy,sum,i);
vis[xx][yy]=0;
}
else if(st!=i){
vis[xx][yy]=1;
dfs(xx,yy,sum+1,i);
vis[xx][yy]=0;
}
else {
vis[xx][yy]=1;
dfs(xx,yy,sum,i);
vis[xx][yy]=0;
}
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mp[i][j];
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(mp[i][j]=='A'){
vis[i][j]=1;
dfs(i,j,0,-1);
}

最低0.47元/天 解锁文章
299

被折叠的 条评论
为什么被折叠?



