#include<iostream> #include<stdio.h> using namespace std; const int N=1e6+6; int n,m,x1,y1,x2,y2,min=N; int g[N][N]; int dx[4]={-1,0,1,0}; int dy[4]={0,-1,0,1}; void dfs(int a,int b,int step){ if(a==x1&&b==y1){ if(step<min){ min=step; return; } } for(int i=0;i<4;i++){ int x,y; x=a+dx[i]; y=b+dy[i]; if(g[x][y]==1){ g[x][y]=0; dfs(x,y,step+1); g[x][y]=0; } } return 0; } int main(){ cin>>n>>m; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>g[i][j]; } } cin>>x1>>y1>>x2>>y2; dfs(x1,y1,0); cout<<min; return 0; }
时间: 2024-04-11 21:27:32 浏览: 89
使用include <iostream>时一定要加using namespace std
在你的代码中,有几个问题需要修正:
1. 在主函数中,你没有为变量 `i` 和 `j` 声明类型,需要进行声明。例如,可以将 `i` 和 `j` 定义为整数类型 `int`。
2. 在 `dfs` 函数中,当遇到 `g[x][y]==1` 时,应该将 `g[x][y]` 的值设置为0,表示已经访问过这个位置。然而,你错误地将其设置为0两次。第一次应该设置为0,第二次应该设置为1(表示还原原始值),以便在回溯时可以重新访问。
修正后的代码如下:
```cpp
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=1e6+6;
int n,m,x1,y1,x2,y2,min_n=N;
int g[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
void dfs(int a,int b,int step){
if(a==x1&&b==y1){
if(step<min_n){
min_n=step;
return;
}
}
for(int i=0;i<4;i++){
int x,y;
x=a+dx[i];
y=b+dy[i];
if(g[x][y]==1){
g[x][y]=0;
dfs(x,y,step+1);
g[x][y]=1; // 还原原始值,以便在回溯时可以重新访问
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
cin>>x1>>y1>>x2>>y2;
dfs(x1,y1,0);
cout<<min_n;
return 0;
}
```
请注意,我还将变量名 `min` 改为 `min_n`,以避免与 C++ 中的 `std::min` 函数冲突。
阅读全文