版权声明:转载请注明出处链接 https://blog.csdn.net/qq_43408238/article/details/89408959
【题目描述】
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
【输入】
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 ≤ n ≤ 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。
【输出】
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
【输入样例】
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
【输出样例】
YES
NO
我也是醉了,debug这长时间,原来是多加一步复原啊!!!因为接触的好几道题目都是有复原的,所以惯性思维,图上问题一般就不加复原了吧,因为走过了就是走过来了。
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <queue>
#include <map>
#define ll long long
using namespace std;
char c[120][120];
ll n,m,s1,s2,e1,e2;bool flag;
ll dir[][2]={{1,0},{0,1},{0,-1},{-1,0}};
void dfs(ll x,ll y)
{
if(x==e1&&y==e2) {flag=true;return ;}
if(flag) return ;
for(ll i=0;i<4;i++)
{
ll a=x+dir[i][0],b=y+dir[i][1];
if(a>=1&&a<=n&&b>=1&&b<=n&&c[a][b]=='.')//判断是否符合条件
{
c[a][b]='#';
dfs(a,b);
//c[a][b]='.';//已经走过这个了,就不需要在走了,不用复原
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
ll t;scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%s",c[i]+1);
scanf("%lld%lld%lld%lld",&s1,&s2,&e1,&e2);
++s1,++s2,++e1,++e2;flag=false;
if(c[s1][s2]=='#'||c[e1][e2]=='#') cout<<"NO"<<endl;
else {
c[s1][s2]='#';
dfs(s1,s2);
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
}
加一个别的
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <set>
#include<queue>
#include <map>
#include <iomanip>
#define INF 0x3f3f3f3f
typedef long long ll;
const ll MAX=1000000;
using namespace std;
char c[120][120];
ll n,m,s1,s2,e1,e2;
ll dir[][2]={{1,0},{0,1},{0,-1},{-1,0}};
bool dfs(ll x,ll y)
{
if(x==e1&&y==e2) return true;
if(x<1||x>n||y<1||y>n) return false;
for(ll i=0;i<=3;i++)
{
ll a=x+dir[i][0],b=y+dir[i][1];
if(c[a][b]=='.')
{
c[a][b]='#';
if(dfs(a,b)) return true;
}
}
return false;
}
int main()
{
// freopen("input.txt","r",stdin);
ll t;cin>>t;
while(t--)
{
cin>>n;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
cin>>c[i][j];
cin>>s1>>s2>>e1>>e2;
s1++,s2++,e1++,e2++;
if(c[s1][s2]=='#'||c[e1][e2]=='#') cout<<"NO"<<endl;
else {
c[s1][s2]='#';
if(dfs(s1,s2)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
}