2020年牛客算法入门课练习赛3 A.dfs

链接: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 
#include 
#include 
#include 
#include 
#include 
#include
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);
   	}
   if(res==0x3f3f3f3f)cout<<-1<<endl;
   else
   cout<<res<<endl;
  return 0;
}

你可能感兴趣的:(牛客)