深搜常见问题总结

1.在main函数中调用dfs时参数出错

题目

题目描述 观音有一件法宝,叫做传送门,我们可以通过这件法宝从妖怪洞穴出去,为了保密,观音把这件法宝放在了一个妖怪洞穴,我们只要找到那个洞穴就可以出去了。观音已经把放法宝洞穴的坐标告诉我了,我们需要编程确定一下是否能到达那个洞穴就行了,如果能到需要多少步,找到所有能到方法数和最快的。唐老大:空空,听紧箍咒和编程你选一个吧。空空:你…(吐血三升),你把样例先告诉我。
输入描述 第一行包含一个正整数N(1<n<30)表示迷宫的长和宽,下面N行,每行有N个数字,其中1表示可以走,0表示死路。接下来两行分别表示悟空和师傅所在洞穴坐标和传送门所在洞穴坐标。
输出描述 如果悟空他们可以成功走到传送门空间就输出需要方法数和最少步数,否则就输出NO。
样例输入
5
1 0 0 1 0
1 1 1 1 1
1 0 1 0 0
1 0 1 1 1
0 1 0 1 0
4 4
2 1
样例输出
1 5

分析

先把第1次写的main函数放出

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>map[i][j];
		}
	}
	cin>>sx>>sy>>ex>>ey;
	if(map[ex][ey]==0){
		cout<<"NO";
		return 0;
	}
	if(sx==ex && sy==ey){
		cout<<"1 0";
		return 0;
	}
	vst[sx][sy]=true;
	dfs(0,0,1); //【重点看这里】
	if(ok==false){
		cout<<"NO";
		return 0;
	}
	cout<<ways<<" "<<minway;
	return 0;
}

注释
dfs函数的三个参数分别代表:x坐标,y坐标,当前所用的步数

问题总结

  1. 根据题目描述,看出搜索的开始位置为输入数据,而不是0,0
  2. 在函数中,会对当前步数进行改变,所以要从0开始传

正确代码

#include<iostream>
using namespace std;
int n,map[50][50],minway=99999,ways,sx,sy,ex,ey,a[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool ok=false,vst[50][50];
void dfs(int x,int y,int d){
	if(x==ex&&y==ey){
		ok=true;
		ways++;
		minway=min(minway,d);
	}
	for(int i=0;i<4;i++){
		int xx=x+a[i][0];
		int yy=y+a[i][1];
		if(xx>0&&xx<=n && yy>0&&yy<=n && vst[xx][yy]==false && map[xx][yy]!=0){
			vst[xx][yy]=true;
			dfs(xx,yy,d+1);
			vst[xx][yy]=false;
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>map[i][j];
		}
	}
	cin>>sx>>sy>>ex>>ey;
	if(map[ex][ey]==0){
		cout<<"NO";
		return 0;
	}
	if(sx==ex && sy==ey){
		cout<<"1 0";
		return 0;
	}
	vst[sx][sy]=true;
	dfs(sx,sy,0);
	if(ok==false){
		cout<<"NO";
		return 0;
	}
	cout<<ways<<" "<<minway;
	return 0;
}

后续更新

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值