[洛谷原题](https://www.luogu.org/problemnew/show/P1238)
AC___20
附代码
#include
using namespace std;
int a[20][20],map[20][20];
int sx,sy,ex,ey,xx,yy;
int past[400][2];
int flag=0;
int n,m;
int p;
int dx[4]= {0,1,0,-1};
int dy[4]= {1,0,-1,0};
void pr(int p) {
/*cout<<"p: "<<p<<endl;
*/
for(int i=1; i<=p; i++)
cout<<"("<<past[i][1]<<","<<past[i][2]<<")"<<"->";
cout<<"("<<ex<<","<<ey<<")"<<endl;
/*for(int i=0; i<n; i++) {
for(int j=0; j<m; j++)
if(map[i][j]==1) {
if(i!=ex&&j!=ey) cout<<"("<<i<<","<<j<<")"<<"->";
else cout<<"("<<ex<<","<<ey<<")"<<endl;
}
}
map[20][20]=0;
*/
}
int dfs(int x,int y,int p) {
if((x==ex)&(y==ey)) {
flag=1;
pr(p);
return 0;
}
for(int i=0; i<4; i++) {
xx=x+dx[i];
yy=y+dy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]==1&&map[xx][yy]==0) {
past[p][1]=x,past[p][2]=y;
/*cout<<"past["<<p<<"][1]"<<past[p][1]<<endl;
cout<<"past["<<p<<"][2]"<<past[p][2]<<endl;
*/
map[x][y]=1;
dfs(xx,yy,p+1);
map[x][y]=0;
}
}
}
int main() {
/*freopen(“c:\luogutest\dataP1238.in”,“r”,stdin);
freopen(“c:\luogutest\dataP1238.out”,“w”,stdout);
*/
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
cin>>sx>>sy;
cin>>ex>>ey;
if(sx==ex&&sy==ey) {
cout<<"-1";
return 0;
}
dfs(sx,sy,1);
/* cout<<"flag: "<<flag<<endl;
*/
if(!flag) cout<<"-1";
return 0;
/*fclose(stdin);
fclose(stdout);
*/
}
错误1 (边界错)
错误2(二维数组遍历有问题)
本题用二维数组表示m行n列,且是从(1,1)点开始,优先顺序是:优先顺序:左、上、右、下
int dx[4]={0,-1,0,1}; //dx 代表行。 不是屏幕坐标,错误2的原因
int dy[4]={-1,0,1,0};// 四个方向,左上右下;dy代表列
错误3(行和列输入搞混了)
错误4(打印函数的边界错误)
AC___100
#include<iostream>
using namespace std;
int a[20][20],map[20][20];
int sx,sy,ex,ey,xx,yy;
int past[400][2];
int flag=0;
int n,m;
int p;
int dx[4]= {0,-1,0,1};
int dy[4]= {-1,0,1,0};
void pr(int p) {
/*cout<<"p: "<<p<<endl;
*/
for(int i=1; i<p; i++)
cout<<"("<<past[i][1]<<","<<past[i][2]<<")"<<"->";
cout<<"("<<ex<<","<<ey<<")"<<endl;
/*for(int i=0; i<n; i++) {
for(int j=0; j<m; j++)
if(map[i][j]==1) {
if(i!=ex&&j!=ey) cout<<"("<<i<<","<<j<<")"<<"->";
else cout<<"("<<ex<<","<<ey<<")"<<endl;
}
}
map[20][20]=0;
*/
}
int dfs(int x,int y,int p) {
if((x==ex)&(y==ey)) {
flag=1;
pr(p);
return 0;
}
for(int i=0; i<4; i++) {
xx=x+dx[i];
yy=y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==1&&map[xx][yy]==0) {
past[p][1]=x,past[p][2]=y;
/*cout<<"past["<<p<<"][1]"<<past[p][1]<<endl;
cout<<"past["<<p<<"][2]"<<past[p][2]<<endl;
*/
map[x][y]=1;
dfs(xx,yy,p+1);
map[x][y]=0;
}
}
}
int main() {
/*freopen("c:\\luogutest\\dataP1238.in","r",stdin);
freopen("c:\\luogutest\\dataP1238.out","w",stdout);
*/
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
cin>>sx>>sy;
cin>>ex>>ey;
if(sx==ex&&sy==ey) {
cout<<"-1";
return 0;
}
dfs(sx,sy,1);
/* cout<<"flag: "<<flag<<endl;
*/
if(!flag) cout<<"-1";
return 0;
/*fclose(stdin);
fclose(stdout);
*/
}