思路:
题目明写了是dfs,但是可能因为最近一段时间都在写数据结构,dfs有点生疏了
dfs模板:
int search(int t)
{
if(满足输出条件){
输出解;}else{
for(int i=1;i<=尝试方法数;i++)if(满足进一步搜索条件){
为进一步搜索所需要的状态打上标记;search(t+1);恢复到打标记前的状态;//也就是说的{回溯一步},需要判断是否需要恢复,具体要看题目的要求}}
}
参考了洛谷的1605的题解
洛谷1695题解
然后写出来这么个玩意儿
vis是否要清零?vis是否必要?
可以肯定的是vis是必要的,不然的话可能一直会走同一条路
那么是否有必要清零呢?
可以联想迷宫,dfs也就是做了这么个事。只要退回到能走到别的路的那个点就可以,不用退回到起始的位置,所以不需要清零。
最终代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int maxx=-0x3f3f3f3f;
int a[111][111],vis[111][111];
int dx[11]={
1,-1,1,1,-1,-1,0,0};
int dy[11]={
0,0,1,-1,1,-1,1,-1};
int n,x1,y1,x2,y2,flag;
void dfs(int x,int y)
{
if(x<0||x>=n) return;if(y<0||y>=n) return;vis[x][y]=1;if(x==x2&&y==y2){
flag=1;return;}for(int i=0;i<8;i++){
if(a[x+dx[i]][y+dy[i]]==0&&vis[x+dx[i]][y+dy[i]]==0){
dfs(x+dx[i],y+dy[i]);if(flag) return;//vis[x+dx[i]][y+dy[i]]=0;}}
}
int main()
{
cin>>n;cin>>x1>>y1>>x2>>y2;for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
char c;cin>>c;a[i][j]=c-'0';}}/*for(int i=0;i<n;i++){for(int j=0;j<n;j++){//cout<<"i="<<i<<" "<<"j="<<j<<endl;cout<<a[i][j];}cout<<endl;}*/dfs(x1,y1);if(flag==1) cout<<"yes"<<endl;if(flag==0) cout<<"no"<<endl;return 0;
}