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;
}