1.5--1792:迷宫

迷宫

题目传送门

思路:

  • 迷宫必须用深搜(我是深搜党)

  • 递归出口条件:

if(ha==hb&&la==lb) 
	{
		cout<<"YES"<<endl;
		flag=1;
}//判断是否是终点
  • 判断越界
if(dx>=0&&dx<n&&dy>=0&&dy<n&&s[dx][dy]=='.')
  • 主函数:
int main()
{
	int k;
	cin>>k;
	while(k--)//效果与for(int i=1;i<=k;i++)一样
	{
		cin>>n;
		for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>s[i][j];
		cin>>ha>>la>>hb>>lb;//输入
		if(s[ha][la]=='#'||s[hb][lb]=='#') cout<<"NO"<<endl;//判断起点和终点是否为障碍物,说实话题目没讲的话其实不加也没什么问题,只是会优化
		else
		{
			flag=0;//标记0
			dfs(ha,la);//用自定义函数
		}	
		if(flag==0) cout<<"NO"<<endl;//如果一种都没有,就是不行
	}
	return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
char s[105][105];
int n,ha,la,hb,lb,dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}},flag;
void dfs(int ha,int la)
{
	if(ha==hb&&la==lb) 
	{
		cout<<"YES"<<endl;
		flag=1;
	}//判断是否是终点
	if(flag) return;
	for(int i=0;i<4;i++)
	{
		int dx=ha+dir[i][0];
		int dy=la+dir[i][1];//dx和dy移动
		if(dx>=0&&dx<n&&dy>=0&&dy<n&&s[dx][dy]=='.')//判断是否越界和是不是障碍物
		{
			s[dx][dy]='#';//标记为障碍物
			dfs(dx,dy);//递归调用
		}
	}
}
int main()
{
	int k;
	cin>>k;
	while(k--)//效果与for(int i=1;i<=k;i++)一样
	{
		cin>>n;
		for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>s[i][j];
		cin>>ha>>la>>hb>>lb;//输入
		if(s[ha][la]=='#'||s[hb][lb]=='#') cout<<"NO"<<endl;//判断起点和终点是否为障碍物,说实话题目没讲的话其实不加也没什么问题,只是会优化
		else
		{
			flag=0;//标记0
			dfs(ha,la);//用自定义函数
		}	
		if(flag==0) cout<<"NO"<<endl;//如果一种都没有,就是不行
	}
	return 0;
}
posted @ 2024-11-08 18:40  落/花/桂/  阅读(3)  评论(0编辑  收藏  举报
/* 设置动态特效 */