记一次搜索回溯的做题过程
题目所在的链接:题目
我的做题过程,一开始像往常一样做,但是写好的程序运行时第一个例子的数据过了,第二个就开始有错误了,这个问题搞了我五六个钟,仔细改了好多细节,结果发现要加个布尔型的数组记录走过的,这个细节我忘了,所以改了一天,哎!!!
还是要注意细节
我的代码:
#include<iostream>
#include<cstring>
using namespace std;
bool a[1001][1001]={false};
char str[1001][1001];
int nm=0;//,ii=0;
//int a[100][2];
//bool f[1001][1001];
//char str[110][110];
int xy[2][4]={{1,-1,0,0},{0,0,1,-1}};
bool isdaoda=false;
int n,x1,y1,x2,y2;//大小的坐标 和起始点,最终点的坐标
int tmpx,tmpy;
void dfs(int x,int y)
{
if(tmpx==x2&&tmpy==y2){//判断是否到达终点
isdaoda=true;//已经达到就返回
return;
}
// if(ii<i) ii=i;
for(int j=0;j<4;j++){
tmpx=x+xy[0][j];
tmpy=y+xy[1][j];
if(tmpx>=0&&tmpx<n&&tmpy>=0&&tmpy<n&&str[tmpx][tmpy]=='.'&&!a[tmpx][tmpy])//判断越界和是否能走
{
a[tmpx][tmpy]=true;//记录已经走过的
dfs(tmpx,tmpy);//否则继续搜
}
}
// if(a[i][0]==hb&&a[i][1]==lb){
// isdaoda=true;
// return;
// }
}
int main(){
char st;
int m;
cin>>m;
for(int t=1;t<=m;t++){
memset(str,0,sizeof(str));
memset(a,false,sizeof(a));
isdaoda=false;
cin>>n;
// m=n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
cin>>str[i][j];
}
}
cin>>x1>>y1>>x2>>y2;
if(str[x1][y1]=='#'||str[x2][y2]=='#')
{
cout<<"NO"<<endl;
continue;
}
a[x1][y1]=true;
dfs(x1,y1);
if(!isdaoda) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}