记一次搜索回溯的做题过程

记一次搜索回溯的做题过程

题目所在的链接题目
我的做题过程,一开始像往常一样做,但是写好的程序运行时第一个例子的数据过了,第二个就开始有错误了,这个问题搞了我五六个钟,仔细改了好多细节,结果发现要加个布尔型的数组记录走过的,这个细节我忘了,所以改了一天,哎!!!
还是要注意细节
我的代码

#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;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值