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坐标,当前所用的步数
问题总结
- 根据题目描述,看出搜索的开始位置为输入数据,而不是0,0
- 在函数中,会对当前步数进行改变,所以要从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;
}